我已经阅读过有关MVVM的MSDN文章,但我并不相信。 如果模型已经实现了INotifyPropertyChanged / INotifyCollectionChanged,那么直接针对Model的View绑定有什么问题? 似乎额外的ModelView引入了一些没有太多好处的代码。 我错过了什么吗?
答案 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)
INotifyPropertyChanged
和INotifyCollectionChanged
并不是唯一需要考虑的方面......在许多情况下,视图无法轻易使用模型公开的数据。 ViewModel的作用是充当模型和视图之间的适配器:以允许视图轻松绑定到它的形式公开数据,公开视图可以绑定的命令以执行操作......通常,模型不会公开ICommand
:如果是,那么模型是特定于WPF的,如果你想在其他非WPF应用程序中重用,这绝不是一件好事......
我已经使用MVVM几个月了,它让我的生活变得更加轻松:代码隐藏文件中不再出现“意大利面条代码”,责任明确分离,整体架构清晰......
答案 2 :(得分:6)
我一直在为2个项目使用MVVM,这里有一些我在ViewModel中做过的事情:
并且还有很多事情要做(我忘记了),不适合模型本身,或者会使用户界面意大利面。
不要忘记,ViewModel使您能够对在UI中实现的无法测试的内容进行单元测试(例如命令)。
最后,使用MVVM,我能够使用ViewModel轻松构建应用程序的命令行版本。
答案 3 :(得分:2)
我现在使用MVVM和MEF几年了,我真的不确定它有多么有用。 在我们的开发中,我们不会将ViewModel重用于不同的视图,我们也没有设计师只允许更改视图(UI)。
在ViewModel中很难实现很多东西,比如根据ViewModel中的变化设置光标焦点(是的,这是可能的,但会给代码带来很多混乱)。
关于MVVM的好处是将值和命令组织为绑定而不是直接设置字段,但这可以在没有ViewModel的情况下完成。