我只需要一个简单的说明:
我有一个带有模型球的示例应用程序和两个视图(假设一个显示球,如果使用鼠标,则可以调整大小,通过单击更改颜色,第二个具有两个子控件的控件) (大小文本框和颜色选择器))。
MVVM是否说我必须在这里拥有两个VM,每个特定视图一个,或者我是否可以在不破坏模式的情况下重用VM?
作为一个后续问题,如果我需要有两个VM是合法的,根据模式将一个作为另一个的派生类型,或者两者都作为基类的派生类型,或者基于复合类在共同的部分?基本上满足了两种类型的需求,但改善了重用?
我的例子是人为的,我试图指出两个Views都会影响模型的两个属性。两个视图之间的最大尺寸,可用颜色等相同。
由于
答案 0 :(得分:2)
在MVVM中使用您在其他任何地方使用的相同编码实践。特别是,请保持干燥。因此,如果您可以使用相同的视图模型,那么就这样做。我想说重用视图模型是非常罕见的。如果您以后必须重构为两个单独的视图模型,但可以从公共基类派生以重用公共部分等,那么就这样做。
答案 1 :(得分:2)
是的,VM非常特定于视图,重新使用的可能性非常小。
实际上我会更进一步,如果你可以重新使用VM,那么我会说它很可能是视图的重复。
我能想到的唯一例外是嵌套分层对象模型结构中的子视图。
答案 2 :(得分:2)
在这种情况下共享ViewModel是完全合适的。 ViewModel是允许View创建Model表示的粘合剂。如果您有两个表示模型相同方面的视图,则使用相同的ViewModel是合乎逻辑的。
如果您发现视图是模型的不同表示,那么您需要重新审视设计。
答案 3 :(得分:2)
虽然没有直接回答你的问题,但请查看Josh Smith关于重复使用ViewModel以及共享引起的“摩擦”这篇有见地的帖子:http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e
他基本上建议改进MVVM(称之为MMVVVM; p!) - 额外的MV适用于ModelView。正如其他人所提到的,ViewModel特定于View并重新使用,这种可能性很小。而是在Model(ModelView)周围创建一个包装器,它可以与任何ViewModel一起使用。
答案 4 :(得分:2)
前一段时间我们有一个案例,我们需要在多个地方复制一个视图,但视图和视图模型的基础类型是不同的。在这种情况下,我们创建了一个通用的viewmodel,并在构造viewmodels时将底层类型作为参数传递,并且能够以这种方式避免代码重复。正如其他人所说,这种情况很少见,所以大多数情况下你会创建新的视图模型(尽管所有的视图模型都可能从公共基类继承,例如属性通知。)
我们也倾向于从我们的数据库实体创建POCO,这样我们的数据库上下文就不会改变,直到我们真的想要应用更改(即Chris描述的MMVVVM(!)模式)