MVVM ViewModel所规定的多步骤操作:最佳实践?

6

想象一下有一个视图,它将展示多个数据收集步骤。根据前面的决策,后续步骤的顺序或特定实例会有所不同。

遵循MVVM纯洁主义的最佳实践,我认为在外部ViewModel中拥有一个ViewModel列表是处理这个问题的方法,然后让外部视图将自定义选项卡控件(或类似控件)绑定到该列表。

这让我想到了两个方面,这对我来说还不太清楚:

第一点:“哪个先出现?”

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

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

我并不完全舒服地在“视图优先”和“ViewModel优先”之间交替使用。

第二点:ViewModel之间的通信

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

这需要外部ViewModel:

  1. 能够接收发送到内部ViewModel的保存命令

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

通常如何处理这种情况?将内部和外部ViewModel绑定在一起是不是不好的实践?


1
请看这里,这个问题有一些相关的信息。 - Snowbear
只有使用View First的方式才是正确的,因为将视图传递给视图模型会违反MVVM原则。对应的视图在xaml中的应用方式如下:'<view:SomeView DataContext="{Binding SomeInnerViewModel}" />'。在通信方面,可以使用MvvmLight库中的Messenger类。 - vortexwolf
我使用 DI 库 并在其映射中选择视图和视图模型,将它们绑定在顶层的“模块”代码中。但我的应用程序从未那么复杂过。这也无法解决您的子视图问题。像 Prism 的 Region 功能 可以帮助解决这个问题。 - Merlyn Morgan-Graham
1个回答

7

1)在我看来,MVVM总是先考虑ViewModels,而Views则绑定到已经实例化的ViewModels。对于所有内部/外部ViewModels。

它们各自的视图从哪里来?哪个实体负责为它们中的每一个选择最佳视图?

在WPF中,我喜欢使用DataTemplating来解决这个问题。在app.xaml或其他应用程序范围的资源文件中,您可以定义针对每个ViewModels的特定DataTemplates。在Views中,将ViewModels绑定到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的保存命令

我会将SaveCommand放在OuterViewModel

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接