使用MVVM,每个UI窗口都有自己的ViewModel吗?

时间:2010-05-07 16:55:28

标签: wpf design-patterns mvvm

当我在MVVM模式下设计多个视图时,每个视图是否都有自己的ViewModel,或者它们是否共享同一个视图?我知道这最终是一个灵活的决定,但最佳做法是什么?

我的直觉告诉我每个视图都有一个ViewModel(即每个单独的UI窗口)。 MVVM的所有博客示例都显示了单一视图,但除此之外没有多少。

3 个答案:

答案 0 :(得分:3)

是的,基本上这个想法是你的viewModel应该只被一个视图使用。如果使用viewModel填充区域(如在ASP.NET MVC中),则每次在不同的位置显示该视图时,都会“重用”该viewModel。

这个article是Josh Smith对MVVM模式的讨论。然后,沃尔贝尔在这article中讨论了他认为乔什遗漏了什么,同时保持乔希的工作仍然非常强大。

沃德在阐述这种模式的复杂性和展现存在的紧张方面做得非常出色。以下是他对紧张局势的看法:

  

根据我的经验,View和ViewModel设计之间存在“对话框”。即使在努力独立于任何特定的具体视图时,VM仍然存在以提供视图。如果没有可以使用它的视图,VM就没用了;显然VM开发人员必须   注意View开发人员的不满。

     

另一方面,在业务应用程序中,应用程序的必要条件 - 视图必须做什么才能满足业务需求 - 是程序员的目标,并且是>最好通过ViewModel的功能进行阐述。

     

View和ViewModel设计之间存在必要的张力。作为开发人员,我对ViewModel的忠诚(“应用程序应该做一些有价值的事情”)但是以牺牲View为代表来捍卫这种忠诚是愚蠢的(“一个好的用户体验对于使应用程序易于学习和使用”)。

答案 1 :(得分:3)

对我来说这是一个主观的陈述 - 教科书,我肯定会说1-1配对 - 并且肯定没有任何错误可以主动并通过设置1-1来设置范例。但是,如果您有多个视图,每个视图代表相同数据的切片,则您不必具有1个 - 您可以在多个视图中重复使用相同的视图,直到出现偏差。视图模型的目的是作为ui和业务层之间的桥梁...如果业务功能相同,您将要么拥有一个共同的视图模型接口或基础并抛弃或者您将要复制多次相同的逻辑。如果视图是唯一改变的东西,我认为重复使用相同的视图模型没有问题,直到出现偏差。

在wpf中,您应该绑定到模型上的值,因此除非您的视图模型具有对您的具体视图的引用,这不应该是一个问题。即便如此,您也可以抽象出一个视图合约(接口)并将属性更改为该类型。

答案 2 :(得分:1)

是的,每个视图都应该在ViewModel上。

我不知道WPF内部,但通常ViewModel介于UI组件和业务逻辑组件之间。换句话说:它特定于视图/模型对 - 这是该组件存在的唯一原因......

HTH。