2013-10-22 49 views
7

我的程序由TreeView和两个在地面的contentPresenters组成。主窗口TreeView和每个contentPresenter都有自己的viewModels。如何从其他视图模型调用主视图模型中的函数?

我想从TreeViewViewModel调用mainWindowViewModel中的函数。

我需要这样做,因为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 
    } 
} 

我试图通过使用获得从TreeViewViewModel访问MainWindowVM

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } } 

但它没有多大意义。因为MWVM不是TreeViewViewModelDataContext

回答

10

此方法和链接答案中使用的delegate方法可用于任何父子关系和任一方向。这包括从子视图模型到父视图模型,隐藏子代Window后面的代码的Window代码,甚至包含没有涉及任何UI的纯数据关系。您可以在MSDN上找到有关使用Delegates (C# Programming Guide)页面中的delegate对象的更多信息。

我刚刚在今天早些时候回答了类似的问题。如果你看一下Passing parameters between viewmodels文章,你会发现答案涉及到使用delegate对象。您可以简单地将这些delegate(从答案中)替换为您的方法,并以相同的方式工作。

如果您有任何问题,请让我知道。


UPDATE >>>

是的,对不起,我完全忘了你想,而不是调用方法......我一直在今晚的工作太多的文章。所以仍然使用从其他职位的例子中,只需要调用你的方法在ParameterViewModel_OnParameterChange处理程序:在delegate

public void ParameterViewModel_OnParameterChange(string parameter) 
{ 
    // Call your method here 
} 

想象成你的路径返回到父视图模型......这就像引发一个事件称为ReadyForYouToCallMethodNow.事实上,你甚至不需要输入参数。你可以定义你delegate是这样的:(在其他例子连接处理程序等之后)

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财产在父视图模型:

TreeViewView

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" /> 

这当然假定父母的一个实例有问题的查看模型被设置为MainWindowDataContext

+0

这个答案唯一不同于我所做的是mainWindowViewModel是父视图模型,这是我试图调用。这是如何改变这个解决方案的? –

+0

使用另一篇文章中的例子,你将在'MainWindowViewModel'类中有一个'ParameterViewModel_OnParameterChange'处理方法。唯一的区别是你在那个处理程序中的更新已经在你想要的地方(在父视图模型中),所以你不需要将这个'parameter'传递给另一个子视图模型......有效地,你可以使用相同的示例,但只需按照“ParameterViewModel_OnParameterChange”处理程序中的值进行操作,而不是将其传递给其他视图模型。 – Sheridan

+0

这似乎是关于将值传递给其他ViewModels并更改参数值。我只想从另一个ViewModel中的'Command'/Function调用'mainWindowViewModel'中的函数。 MWVM中我调用的函数只是根据选择的内容更改'contentPresenter'中提供的内容。 –