如何在顶级ViewModel中嵌套多个ViewModel,这种层次结构可以分散在我的视图中?

时间:2011-01-08 23:40:20

标签: c# wpf mvvm viewmodel hierarchy

现在我有一个相当大的ViewModel名为MainViewModel,其中包含许多可以组织成更合理命名的ViewModel的命令和属性。

但是,我只有一个窗口,因此需要能够从每个SubViewModel中挑选有效数据和命令....

我认为这可以使用属性来实现,但我不太确定如何在XAML中实现这一点。 (或者如果ViewModels本身存在含义)

我意识到我可以在我认为合适的情况下在子视图上设置DataContext,但我想避免让我的View指示我的ViewModel的层次结构/组织。

实施例。伪代码

SubAViewModel mvmB = new SubBViewModel();
SubAViewModel mvmA = new SubAViewModel();
MainViewModel mvm = new MainViewModel( mvmA, mvmB );

<Window DataContext="{StaticResource MainViewModel}">

    //This is clearly wrong but is sort of what I am trying to achieve
    <MenuItem Command="{Binding Path=MainViewModel.SubAVM.TargetCmd}" />

完全有可能MenuItem或其他UserControl想要访问SubBViewModel中的命令和SubAViewModel中的属性。

1 个答案:

答案 0 :(得分:3)

如果您将View的数据上下文设置为MainViewModel,并将SubAVM公开为类似这样的属性:

public SubViewModel SubAVM { 
   get { 
      return subAVM;
   }
   set{
   if (subAVM == value)
   {
      return;
   }
   subAVM = value; //implement the OnPropertyChanged ...
   }
}

当然,MenuItem上的Path将是SubAVM.TargetCmd,因为依赖关系层次结构主路径已经是菜单的MainViewModel。