4

在我的 WPF MVVM 应用程序中,我的模型是一个复杂的模型对象树,在运行时不断变化。模型实例在运行时来来去去,改变它们在树中的位置,当然也改变它们的许多属性。我的视图几乎是该树的一对一视觉表示。每个模型实例在 80% 的情况下也是树中的一个节点。

我现在的问题是我将如何围绕这个设计 ViewModel?我的问题是有很多不同的模型类型,每种类型都有很多属性。如果我正确理解 MVVM,则视图不应直接与模型通信,因此这意味着我必须为每个模型类型创建一个 ViewModel 类型,并且必须在 ViewModel 中重新包装模型类型的每个属性。

ViewModel 还需要“绑定”到 Model 的 propertychanges 以将其传递给视图(使用 wpf datatbinding)。我需要一些工厂来为每个新出现的模型创建并引入一个 ViewModel 实例,并且当相应的模型消失时我会处理每个 ViewModel 实例。我最终会跟踪我创建的所有实例。由于这种双重包装,生成了多少臃肿的代码是令人难以置信的。这真的是一个好方法吗?每个实体和每个属性或多或少都存在两次,我有很多额外的代码使模型和视图保持同步。你怎么处理这个?有没有更聪明的方法来解决这个问题?

有没有人有比我做得更好的参考/示例实现?

4

1 回答 1

9

如果你走这条路,我认为你可能会陷入范式的陷阱。MVVM 只不过是一种模式,它简化了 WPF 世界中的开发。如果没有 - 不要使用它或修改你的方法。我不会花费 80% 的时间来检查“使用 MVVM”字段。

现在回到你的问题。如果我错了,请纠正我,但听起来你是从相反的方向看 MVVM:你不需要ModelViewModel的一一对应。通常,您首先基于您的视图创建 ViewModel,然后才基于模型。

通常,您查看图形设计师的屏幕模型,并创建相应的 ViewModel,它从 Model 中获取所有必要的字段,包装/修改/格式化/组合它们以使 View 开发尽可能简单。

您说您的视图几乎是模型的一对一视觉表示。在这种情况下,创建一个非常简单的 ViewModel 来公开模型树的根对象并让 View 通过该属性直接使用模型可能是有意义的。然后,如果您需要一些 View 自定义或命令处理,您可以将其委托给 ViewModel。

很抱歉回答很模糊。也许如果您提出更具体的问题,我们可以消除困惑:)...

于 2009-10-23T14:50:08.777 回答