一尘不染

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

c#

我的程序由a TreeView和2 组成contentPresenters。mainWindow
TreeView和各自contentPresenter都有自己的viewModel。

我想调用一个函数在mainWindowViewModelTreeViewViewModel

我需要执行此操作,因为该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

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

但这没有多大意义。因为MWVM不是DataContextTreeViewViewModel


阅读 245

收藏
2020-05-19

共1个答案

一尘不染

delegate方法和链接的答案中使用的方法可以在任何父子关系中使用,也可以在任何方向上使用。这包括从子视图模型到父视图模型,子Window代码背后的代码Window,甚至是不涉及任何UI的纯数据关系。您可以delegate从MSDN上的“
委托(C#编程指南)”页面中找到有关使用对象的更多信息。

我刚刚在今天早些时候回答了类似的问题。如果您查看viewmodels之间Passing参数,您将看到答案涉及到使用delegate对象。您可以简单地将这些delegates(从答案中)替换为您的方法,并且将以相同的方式工作。

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


更新>>>

是的,很抱歉,我完全忘记了您想要调用方法,但是…今晚我一直在撰写过多的文章。因此,仍然使用另一篇文章中的示例,只需在ParameterViewModel_OnParameterChange处理程序中调用您的方法即可:

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

可以将其delegate视为返回父视图模型的路径……这就像引发一个名为的事件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}}}" />

当然,这是假设相关父视图模型的实例设置为DataContextMainWindow

2020-05-19