作为学习过程的一部分,我目前正在设计简单的编辑器。它基本上是多边形-线-点的分层树结构,在数据模型中实现。我需要在两个 View 中显示这些数据
第一 View : TreeView 项目中的分层数据 第二个 View :屏幕上呈现的几何图形
遵循 MVVM 模式,我围绕数据模型实现了模型 View 类(点模型 View 、线模型 View 等)。在 TreeView 中,我使用分层数据模板来正确显示特定数据。在第二个 View 中,我需要渲染几何的当前状态,目前它只是一个围绕多边形数据类的模型 View 包装器,它遍历所有子级并在 onRender 方法中渲染它们。在这种情况下,我对相同的数据使用多个 View 模型,两者的目的完全不同。
当我在 TreeView 模型中进行一些修改(例如添加点)时出现问题,导致底层数据模型发生变化。然而,第二个 View 模型并不直接观察模型 View 中的数据,只有当我通过它的模型 View 类进行修改时,它才会更新渲染 View 。是否有一些优雅的解决方案可以同时更新两个 View 模型?
最佳答案
我通过引入 Presenter 解决了这个问题。这基本上是它的工作原理:
- 我的领域模型包含流程的某种表示(称其为任务、工作流或其他)。它包含您正在执行的实际操作的“业务逻辑”。
- 我的演示者被告知要显示该过程。
- 它实例化 ViewModel(如果需要,还实例化多个 ViewModel),为每个 ViewModel 提供对演示者的引用(回调)。
- 在实例化和显示 ViewModel 之后,它将模型的引用传递给它们并告诉它们根据它更新它们的状态。
- ViewModels 不维护对模型的直接引用。当他们想要采取行动时,他们使用在实例化时提供给他们的 Presenter 的回调。 Presenter 实际执行针对 Model 的操作(流程、任务等)。
- 执行 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/