MVVM ViewModel 和子视图

MVVM ViewModel and child Views

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

中的 ContentControl

我的问题是:

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

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

以下是您可能会采取的处理方式...

在您看来,创建一些数据模板,如下所示:

<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 事件。

然后,您需要将向导的 next/previous 按钮绑定到父视图模型中的命令,这些命令会导致 CurrentWizardScreenViewModel 设置为 next/previous 屏幕的视图模型。

如果您这样做,由于数据绑定的魔力,视图将自动负责切换向导屏幕视图。