我正在构建一个MVVM WPF应用程序,其中有一个向导,在父视图(V)中加载了多个子视图,该视图使用ViewModel(VM)作为其数据上下文。其中一个MVVM模式原则指出VM不应该知道绑定它的V.在这种情况下,VM确实不知道V,但是,VM(1)管理由不同子视图(即不同步骤)组成的列表属性,并且(2)具有动态名为CurrentView
的另一个属性在列表中分配一个元素。 CurrentView
绑定到V中的ContentControl
我的问题是:
答案 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>
如果这样做,由于数据绑定的神奇,视图将自动关闭切换向导屏幕视图。