【发布时间】:2009-07-08 22:55:41
【问题描述】:
我已经阅读了关于 MVVM 的 MSDN 文章,但我并不太相信。 如果模型已经实现了 INotifyPropertyChanged/INotifyCollectionChanged,那么 View 直接针对 Model 绑定有什么问题? 似乎额外的 ModelView 引入了一些没有太多好处的代码。 我错过了什么吗?
【问题讨论】:
我已经阅读了关于 MVVM 的 MSDN 文章,但我并不太相信。 如果模型已经实现了 INotifyPropertyChanged/INotifyCollectionChanged,那么 View 直接针对 Model 绑定有什么问题? 似乎额外的 ModelView 引入了一些没有太多好处的代码。 我错过了什么吗?
【问题讨论】:
在我看到 Jason Dolinger 的 great presentation 之前,我也对 MVVM 持怀疑态度。我推荐所有刚开始使用 WPF 和 MVVM 的同事观看它。
Jason 从一个应用程序开始 一个人会写成“传统的” 方式,按钮点击由 代码隐藏中的事件处理程序 然后更新了 UI 的其他部分。 使用 WPF 数据绑定、命令和 团结,他一点一点地改变了它 一块,在一个更易于管理, 封装的、可读的和可测试的 M-V-VM 设计。太棒了。
为了更直接地回答您的问题,即使在您的模型已经拥有一切的情况下绑定到 ViewModel 看起来很愚蠢,您通常最终还是需要对只有 View 需要的模型进行一点调整。随着时间的推移,这些微小的变化将潜入你的模型,它们不属于它们。它会使您的模型比应有的复杂。
当我有一个“拥有一切”的模型时,我经常做的是添加一个包含一个属性的 ViewModel,即模型。然后在我的绑定中,我只是绑定到 Model.Name、Model.Age 等。这真的不费吹灰之力。稍后,如果我只需要对 View 进行调整,我已经准备好 ViewModel 类。这也使您的代码更直观,更易于理解。你不会想知道,在这种情况下我是绑定到模型还是视图模型?它始终是 ViewModel。
【讨论】:
INotifyPropertyChanged 和INotifyCollectionChanged 不是唯一需要考虑的方面...在许多情况下,模型公开的数据将不容易被视图使用。 ViewModel 的作用是充当模型和视图之间的适配器:以允许视图轻松绑定到它的形式公开数据,公开视图可以绑定的命令以执行操作......通常,模型不会公开 ICommands :如果公开,则模型是 WPF 特定的,如果您想在其他非 WPF 应用程序中重用,这绝不是一件好事...
我已经使用 MVVM 几个月了,它让我的生活变得更加轻松:代码隐藏文件中不再有“意大利面条式代码”,职责分工明确,整体架构干净......
【讨论】:
我在 2 个项目中使用了 MVVM,以下是我在 ViewModel 中一直在做的一些事情:
还有很多事情要做(我忘记了)不适合模型本身,或者会使用户界面变成意大利面条。
不要忘记,ViewModel 使您能够对在 UI 中实现时无法测试的事物进行单元测试(例如命令)。
最后,使用 MVVM,我能够使用 ViewModel 非常轻松地构建我的应用程序的命令行版本。
【讨论】:
我在 MEF 中使用 MVVM 已有几年了,但我并不确定它到底有多大帮助。 在我们的开发中,我们不会为不同的 View 重用 ViewModel,我们也没有只允许更改 View (UI) 的设计师。
而且很多事情都很难在 ViewModel 中实现,例如根据 ViewModel 中的更改设置光标焦点(是的,这是可能的,但会给代码增加很多混乱)。
MVVM 的好处是将值和命令组织为绑定,而不是直接设置字段,但这可以在没有 ViewModel 的情况下完成。
【讨论】: