如何从其他视图模型调用主视图模型中的函数?

我的程序由一个TreeView和两个位于地面的contentPresenters组成。 mainWindow, TreeView和每个contentPresenter都有自己的viewModels。

我想从TreeViewViewModelmainWindowViewModel调用一个函数。

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

在这个和相关的答案中使用的delegate方法可以用于任何父子关系和任何方向。 这包括从子视图模型到父视图模型,隐藏在子Window后面的代码的Window代码,甚至没有涉及任何UI的纯数据关系。 您可以从MSDN上的委托(C#编程指南)页面了解更多关于使用delegate对象的信息。

我刚才在今天早些时候回答了一个类似的问题。 如果你看看viewmodels之间的传递参数 ,你会发现答案涉及使用delegate对象。 你可以简单地用你的方法replace这些delegate (从答案中),它将以相同的方式工作。

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


更新>>>

是的,对不起,我完全忘了你想打电话给方法,我今天晚上一直在做太多的post。 所以仍然使用另一篇文章中的例子,只需在ParameterViewModel_OnParameterChange处理函数中调用你的方法:

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

delegate看作是你回到父视图模型的path,这就像引发了一个名为ReadyForYouToCallMethodNow.的事件ReadyForYouToCallMethodNow. 事实上,你甚至不需要input参数。 你可以这样定义你的delegate

 public delegate void ReadyForUpdate(); public ReadyForUpdate OnReadyForUpdate { get; set; } 

然后在父视图模型(在附加处理程序之后,如另一个示例中):

 public void ChildViewModel_OnReadyForUpdate() { // Call your method here UpdateDisplay(); } 

由于您有多个子视图模型,您可以在另一个可以访问的类中定义该delegate 。 如果您还有其他问题,请告诉我。


更新2 >>>

再次阅读你最后的评论之后,我刚刚想到了一个更简单的方法, 可以达到你想要的…至less,如果我正确地理解你的话。 您可以直接从您的子视图Bind到您的父视图模型。 例如,这将允许您将子视图中的Button.Command属性Bind到父视图模型中的ICommand属性:

TreeViewView

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

这当然假定所讨论的父视图模型的一个实例被设置为MainWindowDataContext