2010-08-11 233 views
3

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

第一视图中显示这些数据:在树视图项分层数据 第二种观点:在屏幕上

呈现几何继我已经实现围绕数据模型模型视图类MVVM模式(点模型视图,线模型视图等)。在树状视图中,我使用分层数据模板来正确显示特定数据。在第二个视图中,我需要呈现当前状态的几何图形,目前它只是一个围绕多边形数据类的模型视图包装器,它传播所有子元素并将其呈现在onRender方法中。在这种情况下,我在相同的数据上使用了多个视图模型,两者用于完全不同的目的。

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

回答

0

如果您必须对两个视图使用不同的视图模型,那么可以让几何视图的视图模型在层次视图模型上订阅PropertyChanged,或者您可以为此公开不同的事件。这样,几何视图模型将知道再次查看底层模型并自行更新。

如果您希望进一步解耦,可以使用Prism项目中提供的事件聚合器。

2

我通过介绍Presenter解决了这个问题。这里的基本工作原理是:

  1. 我的域模型包含了过程的一些代表(称之为任务,工作流程,或其他)。它包含您正在执行的实际操作的“业务逻辑”。
  2. 我的演示者被告知显示过程。
  3. 它实例化ViewModel(以及必要时的多个ViewModel),为每个ViewModel提供一个对演示者(回调)的引用。
  4. 在实例化并显示ViewModels之后,它将它们传递给模型的引用并告诉它们从中更新它们的状态。
  5. ViewModels不保留对模型的直接引用。当他们想要采取行动时,他们使用回调到实例化时提供给他们的Presenter。演示者实际上对模型执行动作(过程,任务等)。
  6. 执行操作后,Presenter再次将对新更新模型的引用传递给所有ViewModel,指示它们刷新其状态。

保持它们全部同步,而不需要任何ViewModel知道任何其他ViewModel。我的所有分层视图模型都实现了一个接口IViewModelWithChildren,该接口公开IEnumerable<IViewModel>属性,该属性允许Presenter遍历任何给定的ViewModel树并通知所有这些树,只要它具有对根ViewModel的引用即可。

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