首页 文章

在MVVM模式中,View-first与ViewModel的优缺点是什么[关闭]

提问于
浏览
46

我'm giving a presentation on using MVVM in real world applications and I' m包括在您的应用程序中使用MVVM作为模式时涉及的宗教战争设计决策的一节 . 在MVVM应用程序中,有两种主要方式(我知道)实例化一个新的View / ViewModel对:

  • View-First ,您在其中创建视图,并创建自己的ViewModel并将其设置为其DataContext .

  • ViewModel-First ,您可以在其中创建新视图模型并创建新视图以响应ViewModel属性中的更改,通常使用ItemsControls和/或DataTemplates .

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

结果摘要


  • View First - 优点

  • 轻松跟踪View使用的ViewModel

  • View First - 缺点

  • 不允许单个View轻松与多个ViewModel一起使用

  • 需要额外的事件来处理Views和ViewModel之间的通信

  • ViewModel First - 优点

  • 允许更完整的逻辑测试以打开新的视图和ViewModel

  • 随着应用程序变大,趋向于DRYer

  • View和ViewModel更加独立,可以更容易地单独处理

  • ViewModel First - 缺点

  • 如果没有DataTemplateSelector和类型化的DataTemplates,在Silverlight中设置起来会更加困难 .

6 回答

  • 13

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

  • 1

    鉴于WPF中的数据模板功能,我觉得ViewModel-First是使用WPF intended 的方式 .

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

  • 1

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

  • 0

    警告 - 我使用WPF而不是Silverlight .

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

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

    如果(无论是否使用控制器)我需要一个虚拟机与另一个虚拟机通信,如果V实例化一个虚拟机就很难这样做 - 因为没有我必须在虚拟机中公开虚拟机(或者至少要 Build 一些界面)可用,所以第二个VM可以与第一个通话) .

  • 5

    我更喜欢使用视图模型第一种方法 . 因为许多的原因:

    • Vms是您的应用程序,除了行为或触发器形式的胶水代码之外,还包含大部分逻辑 .

    • 如果您创建视图,那么您负责其生命和清理代码 . 您必须处理难以测试的线程和其他问题 . 另一方面,您可以通过数据模板创建vms并使用WPF保留视图创建逻辑..您不必担心线程问题 . 并且会更好地分离关注点 .

    • 用vm第一个接近零代码 .

    • 通过视图和vms的项目级别隔离,您可以限制开发人员使用视图模型中的调度程序等特定于视图的事物,从而使代码库更加清晰和可测试 . 即将项目sprojec视为vm . 而vm项目不应该引用任何表示库 .

    • 如果视图和vm之间有明确的边界 . 两者都可以发展并且不那么脆弱 .

  • 4

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

    • 这很快,因为原型设计在时间上非常昂贵,而且我经常在第四次或第五次尝试中做到正确(ish) .

    • 当我有一个要遵守的接口时,ViewModels往往容易(更容易)实现 .

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

相关问题