MVVM ViewModel规定的多个步骤:最佳实践?

时间:2011-04-01 08:47:06

标签: c# .net wpf silverlight mvvm

想象一下,有一个View将显示数据收集的多个步骤。根据上一步骤中的决定,以下步骤的顺序或具体实例会有所不同。

遵循MVVM纯粹最佳做法,我想在外部ViewModel中有一个ViewModel列表是这样做的方法,并让外部View绑定自定义选项卡控件(或类似)。

这让我想到了两个方面,我不清楚这一点:

第一点:“哪个先来?”

外部View / ViewModel组合可能是“View First”。也就是说,视图要么接收ViewModel,要么实例化一个ViewModel。

但是当涉及到这个外部ViewModel中的ViewModel列表时:它们各自的Views来自哪里?哪个实体负责为每个实体选择最佳视图?

我不太喜欢像这样在“View First”和“ViewModel First”之间交替使用。

第二点:ViewModels之间的通信

当完成一个内部ViewModel步骤时,例如单击“保存”或“下一步”按钮,应该向该内部ViewModel触发一个命令,然后显示下一个。

这需要外部ViewModel:

  1. 能够获取发送到内部ViewModel的保存命令

  2. 能够访问内部ViewModel中的数据。

  3. 人们通常如何做到这一点?将内部和外部ViewModel与事件绑定在一起被认为是一种不好的做法吗?

1 个答案:

答案 0 :(得分:6)

1)据我所知MVVM总是说ViewModels firstViews绑定已经实例化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