MVVM ViewModel和子视图

时间:2016-04-07 21:40:36

标签: wpf mvvm contentcontrol

我正在构建一个MVVM WPF应用程序,其中有一个向导,在父视图(V)中加载了多个子视图,该视图使用ViewModel(VM)作为其数据上下文。其中一个MVVM模式原则指出VM不应该知道绑定它的V.在这种情况下,VM确实不知道V,但是,VM(1)管理由不同子视图(即不同步骤)组成的列表属性,并且(2)具有动态名为CurrentView的另一个属性在列表中分配一个元素。 CurrentView绑定到V中的ContentControl

我的问题是:

  1. 可以在VM内管理(子)视图吗?换句话说,VM不知道父V,但知道要加载哪些子视图。
  2. 我不是将不同的子VM用于不同的子视图,而是将单个父VM绑定到父V,并且当加载子V时,它可以与包含父V共享相同的数据上下文。这是正确的方法吗?

1 个答案:

答案 0 :(得分:8)

父视图模型应该了解子视图模型,而不是子视图。同样,父视图,而不是视图模型应该负责切换子视图。

在这里,您可以如何解决这个问题......

在您的视图中,创建一些数据模板,如下所示:

<Window.Resources>
    <DataTemplate DataType="{x:Type vm:WizardScreen1ViewModel}">
        <v:WizardScreen1 />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:WizardScreen2ViewModel}">
        <v:WizardScreen2 />
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:WizardScreen3ViewModel}">
        <v:WizardScreen3 />
    </DataTemplate>
</Window.Resources>

然后,在显示当前向导屏幕的视图部分中,添加ContentControl,如下所示:

<ContentControl Content="{Binding CurrentWizardScreenViewModel}" />

在您的父视图模型中,您需要CurrentWizardScreenViewModel属性,以便在更改时触发PropertyChanged事件。

然后,您需要向导的下一个/上一个按钮绑定到父视图模型中的命令,这些命令会将CurrentWizardScreenViewModel设置为下一个/上一个屏幕的视图模型。 / p>

如果这样做,由于数据绑定的神奇,视图将自动关闭切换向导屏幕视图。