如何调用函数在其他视图模型的主视图模型?如何调用函数在其他视图模型的主视图模型?(How to ca

2019-05-08 20:35发布

我的程序是由的TreeView和两个contentPresenters在地面上。 在主窗口, 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
     }
}

我曾试图让访问MainWindowVMTreeViewViewModel使用:

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

但它并没有多大意义。 因为MWVM不是DataContext的的TreeViewViewModel

Answer 1:

delegate在此使用的方法和所链接的答案可以在任何父-子关系,在任一方向上被使用。 从子视图模型父视图模型包括,一个Window后面的孩子后面的代码的代码Window ,甚至是纯数据的关系,而不涉及任何用户界面。 你可以找到更多关于使用delegate从对象代表(C#编程指南) MSDN上的页面。

我刚才已经回答这个今天早些时候类似的问题。 如果你看看在的ViewModels之间传递参数后,你会看到答案涉及使用delegate对象。 你可以简单地替换这些delegate与您的方法(S)(从答案)S和它会以同样的方式工作。

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


UPDATE >>>

是的,对不起,我完全忘了你想,而不是调用方法......我一直在今晚的工作太多的文章。 所以仍然使用从其他职位的例子中,只需要调用你的方法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}}}" />

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



Answer 2:

最简单的方法是一个方法,通过Action向孩子视图模型的构造。

public class ParentViewModel
{
    ChildViewModel childViewModel;

    public ParentViewModel()
    {
        childViewModel = new ChildViewModel(ActionMethod);
    }

    private void ActionMethod()
    {
        Console.WriteLine("Parent method executed");
    }
}

public class ChildViewModel
{
    private readonly Action parentAction;

    public ChildViewModel(Action parentAction)
    {
         this.parentAction = parentAction;

         CallParentAction();
    }

    public void CallParentAction()
    {
        parentAction.Invoke();
    }
}


文章来源: How to call functions in a main view model from other view models?