2009-07-08 58 views
13

我已阅读关于MVVM的MSDN文章,我并不确信。 如果模型已经实现了INotifyPropertyChanged/INotifyCollectionChanged,那么视图与模型直接绑定有什么问题? 看来额外的ModelView引入了一些没有太多好处的代码。 我错过了什么吗?MVVM真的有用吗?

回答

12

我也有点怀疑MVVM,直到我看到Jason Dolinger的great presentation。我建议所有从WPF和MVVM入手的同事观看它。

杰森开始与 人会在“传统” 方式编写,由 事件处理程序在处理按钮点击一个应用程序的代码隐藏的UI是 然后更新的其他部分。 使用WPF数据绑定,命令和 Unity,他对其进行了改造,使用一个更易于管理的,可封装,可读且可测试的M-V-VM设计。太棒了。

更直接地回答你的问题,即使它看起来傻乎乎地绑定到视图模型时,你的模型已经拥有一切,你会经常拉闸需要一个小的调整是唯一由视图所需要的模型。随着时间的推移,这些小的变化会蔓延到你的模型中,他们不属于它们。它会让你的模型比他们应该的更复杂。

当我有一个“拥有一切”模型时,我经常做的是添加一个包含一个属性Model Model的ViewModel。然后在我的绑定中,我只是绑定到Model.Name,Model.Age等。这真的没有任何努力。后来,如果我只需要调整视图,我已经准备好了ViewModel类。这也使您的代码更直观,更易于理解。在这种情况下,你会不会怀疑,我绑定了Model还是ViewModel?它将始终是ViewModel。

+0

当我开始使用MVVM时,我对此持怀疑态度,然后我观看了该视频,现在感觉不好,因为没有使用某种形式的MVVM与我的WPF应用程序。另外阅读Josh Smith撰写的Crack.NET的源代码也很有帮助。 – 2009-07-27 23:05:35

6

INotifyPropertyChangedINotifyCollectionChanged不是唯一需要考虑的方面......在很多情况下,模型公开的数据不易被视图使用。 ViewModel的作用是充当模型和视图之间的适配器:以允许视图轻松绑定到视图的形式公开数据,展示视图可以绑定的命令以执行操作...通常情况下,一个模型不会暴露ICommand s:如果是这样,那么该模型是WPF特定的,这是从来没有好东西,你想在其他非WPF应用程序中重用...

我有一直使用MVVM几个月,它使我的生活变得更加简单:在代码隐藏文件中没有更多的“意大利面条代码”,清晰的职责分工,清晰的整体架构......

6

我已经用了2个项目MVVM这里是我一直在做的视图模型的几件事情:

  • 从模型转换数据(当使用一个视图模型,它使生活容易当UI规范改变,你不需要改变模型/持久性代码)
  • 实现了由模型
  • 实施命令
  • 缓存提供集合的ICollectionView(维持昂贵的计算数据)
  • 维护模型数据字典(快速查找)
  • 延迟加载(不加载,直到它被使用的视图)
  • 管理撤消/重做
  • 数据的验证(IDataErrorInfo的)

还有更多的事情要做(那个我忘了),它不适合模型本身,或者会使用户界面意大利面。

不要忘记,ViewModel使您能够单元测试您无法测试它是否在UI中实现的事物(如命令)。

最后,使用MVVM,通过使用ViewModels,我能够非常轻松地构建我的应用程序的命令行版本。

2

我在MEF使用MVVM几年了,我不确定它真的有多大帮助。 在我们的开发中,我们不会将ViewModel用于不同的Views,我们也没有只允许更改View(UI)的设计师。

许多事情很难在ViewModel中实现,例如根据ViewModel中的更改设置游标焦点(是的,这是可能的,但会增加代码的混乱)。

有关MVVM的好处是将值和命令组织为绑定,而不是直接设置字段,但这可以在没有ViewModel的情况下完成。