MVVM真的有用吗?

时间:2009-07-08 22:55:42

标签: wpf mvvm

我已经阅读过有关MVVM的MSDN文章,但我并不相信。 如果模型已经实现了INotifyPropertyChanged / INotifyCollectionChanged,那么直接针对Model的View绑定有什么问题? 似乎额外的ModelView引入了一些没有太多好处的代码。 我错过了什么吗?

4 个答案:

答案 0 :(得分:12)

在Jason Dolinger观看great presentation之前,我对MVVM也持怀疑态度。我推荐所有在WPF和MVVM中开始观看的同事。

  

杰森开始使用一个应用程序   一个人会写一个“传统的”   方式,按钮点击处理   代码隐藏中的事件处理程序   然后更新了UI的其他部分。   使用WPF数据绑定,命令和   团结,他改变了它,一个接一个   片,更容易管理,   封装,可读和可测试   M-V-VM设计。太棒了。

要更直接地回答你的问题,即使你的模型已经包含所有内容而绑定到ViewModel似乎很愚蠢,你也常常需要对模型进行一点调整,而这只需要View。随着时间的推移,这些微小的变化将蔓延到您不属于您的模型中。它会让你的模型比它们应该更复杂。

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

答案 1 :(得分:6)

INotifyPropertyChangedINotifyCollectionChanged并不是唯一需要考虑的方面......在许多情况下,视图无法轻易使用模型公开的数据。 ViewModel的作用是充当模型和视图之间的适配器:以允许视图轻松绑定到它的形式公开数据,公开视图可以绑定的命令以执行操作......通常,模型不会公开ICommand:如果是,那么模型是特定于WPF的,如果你想在其他非WPF应用程序中重用,这绝不是一件好事......

我已经使用MVVM几个月了,它让我的生活变得更加轻松:代码隐藏文件中不再出现“意大利面条代码”,责任明确分离,整体架构清晰......

答案 2 :(得分:6)

我一直在为2个项目使用MVVM,这里有一些我在ViewModel中做过的事情:

  • 转换模型中的数据(当您使用ViewModel时,它会在UI规范更改时使生活更轻松,您无需更改模型/持久性代码)
  • 在模型提供的集合上实现ICollectionView
  • 实施命令
  • 缓存(维护计算数据的成本很高)
  • 维护模型数据字典(快速查找)
  • 延迟加载(在视图使用之前不加载)
  • 管理撤消/重做
  • 验证数据(IDataErrorInfo)

并且还有很多事情要做(我忘记了),不适合模型本身,或者会使用户界面意大利面。

不要忘记,ViewModel使您能够对在UI中实现的无法测试的内容进行单元测试(例如命令)。

最后,使用MVVM,我能够使用ViewModel轻松构建应用程序的命令行版本。

答案 3 :(得分:2)

我现在使用MVVM和MEF几年了,我真的不确定它有多么有用。 在我们的开发中,我们不会将ViewModel重用于不同的视图,我们也没有设计师只允许更改视图(UI)。

在ViewModel中很难实现很多东西,比如根据ViewModel中的变化设置光标焦点(是的,这是可能的,但会给代码带来很多混乱)。

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