我的程序是由的TreeView
和两个contentPresenters
在地面上。 在主窗口, TreeView
,并且每个contentPresenter
都有自己的ViewModels。
我想调用一个函数在mainWindowViewModel
从TreeViewViewModel
。
我需要这样做,因为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不是DataContext
的的TreeViewViewModel
。
的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
。
最简单的方法是一个方法,通过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();
}
}