想象一下,有一个View将显示数据收集的多个步骤。根据上一步骤中的决定,以下步骤的顺序或具体实例会有所不同。
遵循MVVM纯粹最佳做法,我想在外部ViewModel中有一个ViewModel列表是这样做的方法,并让外部View绑定自定义选项卡控件(或类似)。
这让我想到了两个方面,我不清楚这一点:
第一点:“哪个先来?”
外部View / ViewModel组合可能是“View First”。也就是说,视图要么接收ViewModel,要么实例化一个ViewModel。
但是当涉及到这个外部ViewModel中的ViewModel列表时:它们各自的Views来自哪里?哪个实体负责为每个实体选择最佳视图?
我不太喜欢像这样在“View First”和“ViewModel First”之间交替使用。
第二点:ViewModels之间的通信
当完成一个内部ViewModel步骤时,例如单击“保存”或“下一步”按钮,应该向该内部ViewModel触发一个命令,然后显示下一个。
这需要外部ViewModel:
能够获取发送到内部ViewModel的保存命令
能够访问内部ViewModel中的数据。
人们通常如何做到这一点?将内部和外部ViewModel与事件绑定在一起被认为是一种不好的做法吗?
答案 0 :(得分:6)
1)据我所知MVVM
总是说ViewModels first
和Views
绑定已经实例化ViewModels
。适用于所有内/外ViewModel。
他们各自的观点来自哪里?哪个实体负责为每个实体选择最佳视图?
在WPF中,我更喜欢使用DataTemplating
。在app.xaml
或其他一些应用程序范围的资源文件中,您可以定义特定于每个ViewModel的DataTemplates
。在Views
中,您将ViewModel绑定到ContentPresenter
,DataTemplating将View放在那里。样本:
<强>的App.xaml 强>:
<Application.Resources>
<DataTemplate DataType="{x:Type local:OuterViewModel}">
<local:OuterView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:InnerViewModel}">
<local:InnerView />
</DataTemplate>
<Application.Resources>
<强> OuterView.xaml 强>:
<Grid>
<!-- Assuming OuterViewModel has a property named 'InnerViewModel' -->
<ContentPresenter Content="{Binding InnerViewModel}" />
</Grid>
2)
能够获取发送到内部ViewModel
的Save命令
我会将SaveCommand
放在OuterViewModel
能够访问内部ViewModel中的数据。
我会在OuterViewModel
中引用每个内部ViewModel