我该如何在同一数据上实现多个视图?

时间:2011-06-28 12:03:29

标签: wpf architecture mvvm software-design

我有一个基于MVVM / WPF的应用程序,可以在同一个数据树上显示和操作的同时打开多个工作区(基本上包含一个TreeView)。我需要能够展开和折叠并独立选择每个工作区中的项目,并且我希望能够在两个工作区之间拖放项目(例如,用于移动或复制项目)。我还需要数据虚拟化,因为只在第一次展开树项时才加载数据(在两个视图中)。还有一个工作区范围的详细信息视图,显示当前具有焦点的工作区的所选项目的详细信息。特定于工作区的扩展和项目选择也必须以编程方式工作。

您是否可以为包含这些功能的基于MVVM的应用程序布局ruff设计?我应该为每个工作区创建一个单独的ViewModel树并实现Model-ViewModel映射器吗?或者我应该只有一个具有两个视图的ViewModel树?详细信息视图如何知道当前选择的内容以及具有焦点的工作区? ...

所以重新解释一下我的问题:每个View中显示的Model实例实际上是相同的实例。但ViewModels也应该是一样的吗?或者更好:我可以侥幸逃脱吗?

另外:是否有一个我可以学习的开源应用程序具有大部分功能? Prism或任何其他基于MVVM的框架可以为我做大部分工作吗?

2 个答案:

答案 0 :(得分:2)

View和ViewModel之间存在直接关联。视图显示模型的可视化表示,由ViewModel托管和“格式化”。

由于每个View上都有不同的Model(数据),因此您需要有几个ViewModel实例托管每组不同的数据。

现在的问题是:你的ViewModel是否在它们之间共享一些实体或对象? 如果是,可以在应用程序生命周期内进行更改,并且您是否希望在TreeView中实时查看这些更改?

您有两个选择:

  1. 通过ViewModel公开将模型直接绑定到View(如果模型实现了 INotifyPropertyChanged ):那么当模型属性发生变化时,所有视图都会自动更新。
  2. 创建一个监督模型修改的组件,并通知ViewModel公开它们。
  3. 第二个解决方案比第一个解决方案更纯粹,因为模型应该是POCO,不应该实现一些面向管道的接口。 ViewModel应该处理管道。

    然而,它的设计更复杂,而且90%的时候,你最终都会说“来吧,只有一个小界面不会受到伤害”:))

    对于详细信息视图。您可以使用中介(MVVM Light Toolkit中的Messenger)在TreeViewModel和DetailViewModel之间进行通信,这基本上是一个低耦合事件导向组件。或者使用一个注册在所有ViewModel中的主管,并使用事件通知他们。

    说到MVVM框架,对于你所描述的通用架构,我建议使用MVVM Light Toolkit

答案 1 :(得分:0)

也许我遗漏了一些东西,但是不可能有2个相同View / ViewModel的实例加载了不同的数据吗?