c# - wpf 中的 MVVM 模式 - 一个数据模型,多个 View 模型

标签 c# mvvm model

作为学习过程的一部分,我目前正在设计简单的编辑器。它基本上是多边形-线-点的分层树结构,在数据模型中实现。我需要在两个 View 中显示这些数据

第一 View : TreeView 项目中的分层数据 第二个 View :屏幕上呈现的几何图形

遵循 MVVM 模式,我围绕数据模型实现了模型 View 类(点模型 View 、线模型 View 等)。在 TreeView 中,我使用分层数据模板来正确显示特定数据。在第二个 View 中,我需要渲染几何的当前状态,目前它只是一个围绕多边形数据类的模型 View 包装器,它遍历所有子级并在 onRender 方法中渲染它们。在这种情况下,我对相同的数据使用多个 View 模型,两者的目的完全不同。

当我在 TreeView 模型中进行一些修改(例如添加点)时出现问题,导致底层数据模型发生变化。然而,第二个 View 模型并不直接观察模型 View 中的数据,只有当我通过它的模型 View 类进行修改时,它才会更新渲染 View 。是否有一些优雅的解决方案可以同时更新两个 View 模型?

最佳答案

我通过引入 Presenter 解决了这个问题。这基本上是它的工作原理:

  1. 我的领域模型包含流程的某种表示(称其为任务、工作流或其他)。它包含您正在执行的实际操作的“业务逻辑”。
  2. 我的演示者被告知要显示该过程。
  3. 它实例化 ViewModel(如果需要,还实例化多个 ViewModel),为每个 ViewModel 提供对演示者的引用(回调)。
  4. 在实例化和显示 ViewModel 之后,它将模型的引用传递给它们并告诉它们根据它更新它们的状态。
  5. ViewModels 不维护对模型的直接引用。当他们想要采取行动时,他们使用在实例化时提供给他们的 Presenter 的回调。 Presenter 实际执行针对 Model 的操作(流程、任务等)。
  6. 执行 Action 后,Presenter 再次将对新更新模型的引用传递给所有 ViewModel,指示它们刷新状态。

这使它们保持同步,而无需任何 ViewModel 了解任何其他 ViewModel。我所有的分层 View 模型都实现了一个接口(interface) IViewModelWithChildren ,它公开了一个 IEnumerable<IViewModel>属性,它允许 Presenter 遍历任何给定的 ViewModel 树并通知所有这些树,只要它具有对根 ViewModel 的引用。

我也喜欢它,因为它通过一个点(Presenter 回调)汇集所有用户操作,我可以在那里注入(inject)某些关注点。例如,如果模型逻辑中发生未处理的异常,我可以在此时捕获它并实例化一个漂亮的 MessageViewModel 以显示给用户。

关于c# - wpf 中的 MVVM 模式 - 一个数据模型,多个 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463287/

相关文章:

c# - 是否有任何 LINQ 表达式将数据表转换为字典

c# - 如果由 Windows 窗体应用程序打开,如何以编程方式转到记事本文件的末尾

mysql - 优化通过 has_many :through association 检索 ID 的方式

php - 拉拉维尔 5.2 : Order Models by Pivot table field

c# - 带有任意元组的字典作为键(没有包装在一个类中)

c# - 获取列表框中复选框的 IsChecked 属性

c# - MVVM - 绑定(bind)到聚合属性

c# - 带有 WCF 服务列表的数据绑定(bind)组合框

c# - 每个字典条目都必须有一个关联的键属性

wpf - 将 3D Max 模型转换为 XAML?