如何从其他视图模型调用主视图模型中的函数?
我的程序由一个TreeView
和两个位于地面的contentPresenters
组成。 mainWindow, 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不是TreeViewViewModel
的DataContext
。
在这个和相关的答案中使用的
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}}}" />
这当然假定所讨论的父视图模型的一个实例被设置为MainWindow
的DataContext
。