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

Bol*_*Bob 6 .net c# silverlight wpf 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的Save命令

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

人们通常会怎么做?将内部和外部ViewModel与事件绑定在一起被认为是一种不好的做法吗?

Sno*_*ear 6

1)在我的理解中MVVM总是说ViewModels first并且Views必须已经实例化ViewModels.适用于所有内/外ViewModel.

他们各自的观点来自哪里?哪个实体负责为每个实体选择最佳视图?

在WPF中,我更喜欢使用DataTemplating这个原因.在您app.xamlDataTemplates每个应用程序范围的资源文件中,您定义特定于每个ViewModel.在Views你把一个绑定到ViewModel ContentPresenter和DataTemplating 绑定到那里.样品:

App.xaml:

<Application.Resources>
    <DataTemplate DataType="{x:Type local:OuterViewModel}">
        <local:OuterView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:InnerViewModel}">
        <local:InnerView />
    </DataTemplate>
<Application.Resources>
Run Code Online (Sandbox Code Playgroud)

OuterView.xaml:

<Grid>
    <!-- Assuming OuterViewModel has a property named 'InnerViewModel' -->
    <ContentPresenter Content="{Binding InnerViewModel}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

2)

能够拿起发送到内部ViewModel的Save命令

我把SaveCommandOuterViewModel

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

我会在OuterViewModel中引用每个内部ViewModel