在我的WPF MVVM应用程序中,我的模型是一个复杂的Model对象树,它在运行时不断变化。模型实例在运行时来来去去,改变它们在树中的位置,当然也会改变它们的许多属性。我的视图几乎是该树的一对一视觉表示。每个Model实例在80%的情况下也是树中的节点。
我现在的问题是如何围绕这个设计ViewModel?我的问题是,有很多不同的模型类型,每个都有很多属性。如果我理解MVVM,那么视图不应该直接与Model通信,这就意味着我必须为每个Model类型创建一个ViewModel类型,并且必须在ViewModel中重新包装Model类型的每个属性。
此外,ViewModel需要“绑定”到Model的属性更改以将其传递给视图(使用wpf datatbinding)。我需要一些工厂为每个重新出现的Model创建并引入一个ViewModel实例,并且当相应的Model消失时我会安排处理每个ViewModel实例。我最终跟踪我创建的所有实例。令人难以置信的是,这种双重包装会产生多少膨胀代码。 这真的是一个好方法吗?每个实体和每个属性更少的存在两次,我有很多额外的代码保持模型和视图同步。你怎么处理这个?有没有更聪明的方法来解决这个问题?
有没有人为此做过参考/样本实现,比我更好?
答案 0 :(得分:9)
如果你遵循这条道路,我认为你可能会陷入范式陷阱。 MVVM只不过是一种模式,它简化了WPF世界的开发。如果没有 - 不要使用它或修改你的方法。我不会花80%的时间来检查“使用MVVM”字段。
现在回到你的问题。如果我错了,请纠正我,但听起来你正在从相反的方向看MVVM:你不需要模型与 ViewModel 一一对应。通常,您首先根据View创建ViewModel,然后才在Model上创建。
通常,您从图形设计器查看屏幕样机,并创建相应的ViewModel,它从模型中获取所有必需的字段,包装/修改/格式化/组合它们,以使View开发尽可能简单。
您说您的视图几乎是模型的一对一视觉表示。在这种情况下,可能有意义创建一个非常简单的ViewModel,它暴露模型树的根对象,让View直接通过该属性使用模型。然后,如果您需要一些View自定义或命令处理,您可以将其委托给ViewModel。
抱歉非常模糊的回答。也许如果你问更具体的问题,我们可以消除混乱:)...