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

Bry*_*son 48 mvvm

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

  1. View-First,您在其中创建视图,并创建自己的ViewModel并将其设置为DataContext.
  2. ViewModel-First,您可以在其中创建新视图模型并创建新视图以响应ViewModel属性中的更改,通常使用ItemsControls和/或DataTemplates.

根据您的经验,每种方法的优缺点是什么?它们启用了什么以及您遇到的问题是什么?

结果摘要


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

And*_*uus 17

鉴于WPF数据模板的功能,我觉得视图模型,首先是WPF的样子打算使用.

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

  • 没问题,它仍然是一个很好的答案,因为它解释了VM优先的一个好处. (3认同)

Kav*_*rek 5

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


Gob*_*lin 0

我使用视图优先(某种程度)的方法。我与客户合作使用带有测试数据的虚拟视图模型定义视图。当我们满意时,我继续从“虚拟”中提取一个接口并实现真正的 ViewModel。我发现这种方法最有吸引力,原因如下:

  • 它的速度很快,因为原型制作在时间上并不昂贵,而且我经常在第四次或第五次尝试中就成功了。
  • 当我有一个可以遵循的接口时,ViewModel 往往很容易(更容易)实现。

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