在MVVM模式中,View-first与ViewModel的优缺点是什么?

时间:2010-09-21 17:57:56

标签: mvvm

我正在介绍如何在真实世界的应用程序中使用MVVM,并且我将在使用MVVM作为应用程序模式时涉及的宗教战争设计决策中包含一节。在MVVM应用程序中,有两种主要方式(我知道)实例化一个新的View / ViewModel对:

  1. View-First ,您可以在其中创建一个视图,并创建自己的ViewModel并将其设置为DataContext。
  2. ViewModel-First ,您可以在其中创建新视图模型并创建新视图以响应ViewModel属性中的更改,通常使用ItemsControls和/或DataTemplates。
  3. 根据您的经验,每种方法的优缺点是什么?它们启用了什么以及您遇到的问题是什么?

    结果摘要


    • 查看第一个 - 优点
      • 轻松跟踪View
      • 使用的ViewModel
    • 查看第一个 - 缺点
      • 不允许单个View轻松与多个ViewModel一起使用
      • 需要额外的事件来处理Views和ViewModels之间的通信
    • ViewModel First - 优点
      • 允许更完整的逻辑测试以打开新的视图和ViewModel
      • 随着应用程序变得更大,趋向于DRYer
      • View和ViewModel更独立,可以更轻松地单独处理
    • ViewModel First - 缺点
      • 在没有DataTemplateSelector和类型化DataTemplates的Silverlight中设置起来比较困难。

6 个答案:

答案 0 :(得分:16)

鉴于WPF中的数据模板功能,我认为ViewModel-First是WPF 预期的使用方式。

我将澄清该声明:Data Templating允许您永远不会从ViewModel实例化视图。如果正确完成,您的Views和ViewModel可以保存在不相互引用的单独项目中。此外,ViewModel项目甚至不应引用任何PresentationFramework程序集,使您的ViewModel可供任何可以想象的用户使用。

答案 1 :(得分:5)

我倾向于首先选择View-Model,因为我觉得它最符合DRY规则。当你开始创建更大规模的应用程序时,我发现这也使得测试更容易,因此超过了在设置应用程序时需要处理的头痛问题。

答案 2 :(得分:4)

警告 - 我使用WPF而非Silverlight。

通过虚拟机实例化V(这是我的方式),视图是独立的,可以独立于VM使用(例如在设计器中)

就个人而言,我正在向MVVMC(模型,视图,ViewModel,Controller)转向,我有一个控制类,它实例化ViewModels和Views并“加入它们”。然后,C还处理获取数据(并缓存它等)以及跨VM和Vs的任何通信(例如,如果实例化V,将命令路由到其VM以执行某些操作,VM可能会要求C执行代表它的行动;然后C可以引发其他VM可以处理的适当事件

如果(无论是否使用控制器)我需要一台虚拟机与另一台虚拟机通信,如果V实例化一台虚拟机则更难实现 - 因为我不需要在虚拟机中暴露虚拟机(或至少使一些界面可用,以便第二个VM可以与第一个通信。

答案 3 :(得分:1)

我们首先使用了ViewModel,但是当进行外包时,使用混合成为最重要的事情,我的老板说View-first比Viewmodel优先 - 我不同意他(但是一对多是不是最佳的投票比率;-)),因为现在我们与代码背后的视图事件有一些怪异的联系。现在我处于不可逆转的状态,而且由于变化,我陷入了一些自定义控件 -

答案 4 :(得分:1)

我更喜欢使用视图模型第一种方法。出于多种原因:

  • Vms是您的应用程序,除了行为或触发器形式的胶水代码外,还包含大部分逻辑。
  • 如果您创建视图,那么您应对其生命和清理代码负责。您必须处理难以测试的线程和其他问题。另一方面,您可以通过数据模板创建vms并使用WPF保留视图创建逻辑..您不必担心线程问题。并且会更好地分离关注点。
  • vm首先接近零代码。
  • 通过视图和vms的项目级别隔离,您可以限制开发人员使用视图模型中的调度程序等特定于视图的事物,从而使代码库更加清晰和可测试。即将项目sprojec视为vm。 vm项目不应该引用任何表示库。
  • 如果view和vm之间有明确的边界。两者都可以发展并且不那么脆弱。

答案 5 :(得分:0)

我使用View-first(排序)方法。我使用带有测试数据的虚拟视图模型与我的客户端合作定义View。当我们满意时,我继续从'dummy'中提取一个接口并实现真正的ViewModel。我发现这种方法最吸引人的原因如下:

  • 由于原型制作在时间上非常昂贵,而且在第四次或第五次尝试中我经常做对(ish),所以速度很快。
  • 当我有一个要遵守的界面时,ViewModels往往容易(更容易)实现。

我在WPF工作,但我认为在SL中不会有太大的不同。此外,我从不花时间测试可能归因于我选择方法的观点。