如何从其他视图模型调用主视图模型中的函数?
我的程序由一个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 。