【问题标题】:Multiple steps dictated by a MVVM ViewModel: Best practices?MVVM ViewModel 规定的多个步骤:最佳实践?
【发布时间】:2011-07-27 12:45:58
【问题描述】:

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

遵循 MVVM 纯粹的最佳实践,我认为在外部 ViewModel 中拥有一个 ViewModel 列表是解决此问题的方法,并让外部 View 绑定一个自定义选项卡控件(或类似控件)。

这让我想到了我不清楚的两个方面:

第一点:“哪个先来?”

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

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

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

第二点:ViewModel 之间的通信

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

这需要外部 ViewModel:

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

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

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

【问题讨论】:

  • 请看here,这个问题有一些相关信息
  • View First 只是一种正确的方法,因为将视图传递给视图模型违反了 MVVM 的原则。在 xaml 中应用了相应的视图,例如“”。使用 MvvmLight 库中的 Messenger 类进行通信。
  • 我使用a DI library 并在其映射中选择视图和视图模型,在顶级“模块”代码中将事物绑定在一起。但我的应用程序从未如此复杂。这也不能解决您的子视图问题。像 Prism Region feature 这样的东西可能会对此有所帮助。

标签: c# .net wpf silverlight mvvm


【解决方案1】:

1) 在我的理解中MVVM 总是说ViewModels firstViews 绑定到已经实例化的ViewModels。对于所有内部/外部 ViewModel。

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

出于这个原因,在 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 的保存命令

我会把SaveCommand放在OuterViewModel

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2011-04-12
    • 2011-08-06
    相关资源
    最近更新 更多