【发布时间】: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:
能够接收发送到内部 ViewModel 的 Save 命令
能够访问内部 ViewModel 中的数据。
通常人们会怎么做呢?将内部和外部 ViewModel 与事件联系在一起是否被认为是一种不好的做法?
【问题讨论】:
-
请看here,这个问题有一些相关信息
-
View First 只是一种正确的方法,因为将视图传递给视图模型违反了 MVVM 的原则。在 xaml 中应用了相应的视图,例如“
”。使用 MvvmLight 库中的 Messenger 类进行通信。 -
我使用a DI library 并在其映射中选择视图和视图模型,在顶级“模块”代码中将事物绑定在一起。但我的应用程序从未如此复杂。这也不能解决您的子视图问题。像 Prism Region feature 这样的东西可能会对此有所帮助。
标签: c# .net wpf silverlight mvvm