MVVM ViewModel和子视图

tab*_*7vn 3 wpf mvvm contentcontrol

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

我的问题是:

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

dev*_*xer 9

父视图模型应该具有子视图模型的知识,而不是子视图.同样,父视图而不是视图模型应该负责切换子视图.

以下是你如何做到这一点......

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

<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>
Run Code Online (Sandbox Code Playgroud)

然后,在您显示当前向导屏幕的视图部分中,放置一个ContentControl,如下所示:

<ContentControl Content="{Binding CurrentWizardScreenViewModel}" />
Run Code Online (Sandbox Code Playgroud)

在父视图模型中,您将需要一个在更改时CurrentWizardScreenViewModel触发PropertyChanged事件的属性.

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

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

  • @tab87vn,有几种方法可以实现:(1)让父视图模型通过侦听每个子视图模型上的更改通知来管理/编排共享状态,然后通知其他子视图模型新的状态状态或(2)您可以将父视图模型排除在外,而让子视图模型直接使用信使(大多数 MVVM 库支持)相互通信。 (2认同)