我的程序由a TreeView和2 组成contentPresenters。mainWindow TreeView和各自contentPresenter都有自己的viewModel。
TreeView
contentPresenters
contentPresenter
我想调用一个函数在mainWindowViewModel从TreeViewViewModel。
mainWindowViewModel
TreeViewViewModel
我需要执行此操作,因为该mainWindowViewModel控件可以控制显示在中的内容contentPresenters,并且我想手动更新显示内容。
我猜我会做这样的事情…
TreeViewViewModel :
public class TreeViewViewModel { //Do I need to declare the MainWindowVM? public TreeViewViewModel() { ... } private void function() { //Command that affects display //Manually call function in MainWindowVM to refresh View } }
我尝试使用以下方法MainWindowVM从访问TreeViewViewModel:
MainWindowVM
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }
但这没有多大意义。因为MWVM不是DataContext的TreeViewViewModel。
DataContext
此delegate方法和链接的答案中使用的方法可以在任何父子关系中使用,也可以在任何方向上使用。这包括从子视图模型到父视图模型,子Window代码背后的代码Window,甚至是不涉及任何UI的纯数据关系。您可以delegate从MSDN上的“ 委托(C#编程指南)”页面中找到有关使用对象的更多信息。
delegate
Window
我刚刚在今天早些时候回答了类似的问题。如果您查看viewmodels之间的Passing参数,您将看到答案涉及到使用delegate对象。您可以简单地将这些delegates(从答案中)替换为您的方法,并且将以相同的方式工作。
请让我知道,如果你有任何问题。
更新>>>
是的,很抱歉,我完全忘记了您想要调用方法,但是…今晚我一直在撰写过多的文章。因此,仍然使用另一篇文章中的示例,只需在ParameterViewModel_OnParameterChange处理程序中调用您的方法即可:
ParameterViewModel_OnParameterChange
public void ParameterViewModel_OnParameterChange(string parameter) { // Call your method here }
可以将其delegate视为返回父视图模型的路径……这就像引发一个名为的事件ReadyForYouToCallMethodNow.。实际上,您甚至不需要输入参数。您可以这样定义delegate:
ReadyForYouToCallMethodNow.
public delegate void ReadyForUpdate(); public ReadyForUpdate OnReadyForUpdate { get; set; }
然后在父视图模型中(在像另一个示例一样附加处理程序之后):
public void ChildViewModel_OnReadyForUpdate() { // Call your method here UpdateDisplay(); }
由于您有多个子视图模型,因此可以delegate在它们都可以访问的另一个类中定义。如果您还有其他问题,请告诉我。
更新2 >>>
再次阅读您的最新评论后,我想到了一种更简单的方法,该方法 可以 实现您想要的…至少,如果我正确理解您的话。您可以Bind直接从子视图到父视图模型。例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性:
Bind
Button.Command
ICommand
在TreeViewView:
TreeViewView
<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
当然,这是假设相关父视图模型的实例设置为DataContext的MainWindow。
MainWindow