【问题标题】:MVVM pattern in wpf - one data model , multiple view modelswpf 中的 MVVM 模式 - 一个数据模型,多个视图模型
【发布时间】:2010-08-11 22:15:27
【问题描述】:

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

第一个视图:树视图项中的分层数据 第二个视图:在屏幕上渲染几何体

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

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

【问题讨论】:

    标签: c# mvvm model


    【解决方案1】:

    我通过介绍 Presenter 解决了这个问题。基本上它是这样工作的:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 2019-10-03
        • 1970-01-01
        相关资源
        最近更新 更多