MVVM中的VM可以被重用吗?

7
我只需要一个简单的澄清:
我有一个示例应用程序,其中包含一个球的模型和两个视图(假设一个显示球并允许您使用鼠标调整其大小、点击更改其颜色,第二个具有两个子控件的控件(大小文本框和颜色选择器))。
MVVM是否要求我在这里必须有两个VM,一个用于每个特定视图,或者我可以重用VM而不破坏模式?
作为后续问题,如果我需要有两个VM,则根据该模式,将一个VM作为另一个VM的派生类型,或将两个VM作为基类的派生类型,或基于共同部分的组合类都是合法的吗?基本上满足了两种类型的需求,但提高了重用性?
我的示例是人为的,我试图说明两个视图都影响模型的相同两个属性。最大尺寸、可用颜色等在两个视图之间是相同的。
谢谢
5个回答

2

在MVVM中使用与任何其他地方相同的编码实践。特别是要保持DRY(不要重复自己)。因此,如果可以使用相同的视图模型,则应该这样做。虽然我认为重用视图模型非常罕见。但如果以后需要重构成两个单独的视图模型,但可以从一个共同的基类派生来重用公共部分等,则应该这样做。


我想在我的脑海里,这就是我担心的事情。为了符合模式而妥协DRY。我的例子真的很牵强,这与我上周关于创建子视图模型的问题有关,所以Aliostad无意中猜到了我正在做的事情 :) - Ian

2

是的,虚拟机非常特定于视图,重复使用的可能性非常小。

实际上,我想进一步说,如果您可以重复使用虚拟机,那么我会说这很可能是视图的复制。

唯一的例外我能想到的是嵌套层次对象模型结构中的子视图。


基于不同的角色、设备或其他设置或配置,使用不同的视图如何? - Michiel Cornille

2

在这种情况下,共享ViewModel是完全合适的。 ViewModel是一种粘合剂,它允许View创建Model的表示形式。如果您有两个表示模型相同方面的视图,则使用相同的ViewModel是合理的。

如果随着时间的推移,您发现视图是模型的不同表示形式,则需要重新审视设计。


2
虽然没有直接回答你的问题,但是请查看Josh Smith的这篇有深度的文章,关于重用ViewModel和共享时造成的“摩擦”:http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e 他基本上提出了对MVVM的改进(称之为MMVVVM;呼!)-额外的MV是指ModelView。正如其他人所提到的,ViewModel是特定于View的,因此不太可能重复使用。但是,可以创建一个包装器(ModelView),围绕Model进行封装,该封装器可以与任何ViewModel一起重复使用。

2

我们有一个案例,需要在多个地方复制一个视图,但是视图和视图模型的基础类型不同。 在这种情况下,我们创建了一个通用视图模型,并在构建视图模型时将基础类型作为参数传递,以此避免了代码重复。 正如其他人所说,这种情况很少发生,因此大多数情况下您将创建新的视图模型(尽管所有视图模型可能都继承自一个通用基类,例如属性通知)。

我们还倾向于从我们的数据库实体中创建POCO,以便在真正想要应用更改之前,不会更改我们的数据库上下文(即Chris描述的MMVVVM(!)模式)


通常有实际和概念上的区分,所以对我来说重要的是知道在模式的限制范围内允许什么,而不管这是否是一个真实的使用案例。我记得很久以前读到过关于 MMVVVM 的文章,但没有任何真实的背景去理解那些信息。奇怪的是,我最终还是在那里结束了。感谢大家的帮助和建议。 - Ian

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