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

Eri*_*ark 9 c# wpf mvvm viewmodel

我的节目由一个TreeView和两个contentPresenters地面组成.mainWindow,TreeView和每个contentPresenter都有自己的viewModels.

我想调用一个函数在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
     }
}
Run Code Online (Sandbox Code Playgroud)

我试图通过使用来访问MainWindowVM来自TreeViewViewModel:

public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }
Run Code Online (Sandbox Code Playgroud)

但它没有多大意义.因为MWVM不是DataContextTreeViewViewModel.

She*_*dan 11

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

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

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


更新>>>

是的,对不起,我完全忘了你想打电话给方法......我今晚一直在做太多的帖子.所以仍然使用其他帖子中的示例,只需在ParameterViewModel_OnParameterChange处理程序中调用您的方法:

public void ParameterViewModel_OnParameterChange(string parameter)
{
    // Call your method here
}
Run Code Online (Sandbox Code Playgroud)

把它delegate看作是你回到父视图模型的路径......就像提出一个名为的事件ReadyForYouToCallMethodNow.实际上,你甚至不需要输入参数.你可以这样定义delegate:

public delegate void ReadyForUpdate();

public ReadyForUpdate OnReadyForUpdate { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

public void ChildViewModel_OnReadyForUpdate()
{
    // Call your method here
    UpdateDisplay();
}
Run Code Online (Sandbox Code Playgroud)

由于您有多个子视图模型,因此可以delegate在另一个可以访问的类中定义它们.如果您还有其他问题,请与我们联系.


更新2 >>>

在再次阅读你的最后一条评论之后,我想到了一个更简单的方法,可以实现你想要的......至少,如果我理解你的话.您可以Bind直接从子视图到父视图模型.例如,这将允许你Bind一个Button.Command在子视图的财产ICommand在你的父视图模型属性:

TreeViewView:

<Button Content="Click Me" Command="{Binding DataContext.ParentCommand, 
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
Run Code Online (Sandbox Code Playgroud)

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