WPF中的MVVM模式 - 一个数据模型,多个视图模型。

3

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

第一个视图:树形视图中的分层数据

第二个视图:屏幕上呈现的几何图形

按照MVVM模式,我已经围绕数据模型实现了模型视图类(点模型视图,线模型视图等)。在树形视图中,我使用分层数据模板来正确显示特定数据。在第二个视图中,我需要呈现几何图形的当前状态,目前只是一个包装多边形数据类的模型视图,它遍历所有子项并在onRender方法中呈现它们。在这种情况下,我在相同的数据上使用多个视图模型,用于非常不同的目的。

当我在树形视图模型中进行一些修改(例如添加点)时,会导致底层数据模型的更改。但是,第二个视图模型不直接观察模型视图中的数据,它仅在我通过其模型视图类进行修改时更新呈现视图。是否有一些优雅的解决方案可以同时更新两个视图模型?

2个回答

2
我通过引入Presenter来解决这个问题。以下是基本工作原理:
1. 我的领域模型包含某个流程的表示(称其为任务、工作流或其他)。它包含实际操作的“业务逻辑”。
2. 要求我的Presenter显示该流程。
3. 它实例化ViewModel(如果需要,可以多个ViewModel),并给每个ViewModel一个对Presenter的引用(回调)。
4. 在实例化和显示ViewModel之后,它会向它们传递Model的引用,并告诉它们从中更新自己的状态。
5. ViewModel不维护与Model的直接引用。当它们想采取行动时,它们使用在实例化时提供给它们的Presenter回调。Presenter实际上针对Model(流程、任务或其他)执行操作。
6. 执行操作后,Presenter再次传递对新更新的Model的引用到所有的ViewModel,并指示它们刷新其状态。
这样就能使它们都保持同步,而不需要任何一个ViewModel了解其他任何ViewModel。我所有的分层ViewModel都实现了一个接口IViewModelWithChildren,其中公开了一个IEnumerable 属性,这使得Presenter可以遍历任何给定的ViewModel树并通知它们,只要它有对根ViewModel的引用。
我也喜欢它,因为它将所有用户操作汇集到一个单一点(Presenter回调),我可以在那里注入某些关注点。例如,如果Model逻辑中发生未处理的异常,我可以在那一点捕获它并实例化一个漂亮的MessageViewModel以显示给用户。

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接