我知道已经有关于这个主题的问题了,但是那里的问题比较特定,没有提供决定性的答案。
尤其是这些问题:Question1、Question2和当然还有Question3,所以请不要轻易关闭这个问题。那里的回答只是说“这样做,那样做”,而不是为什么!
有些人否认使用ViewModel
的必要性,他们认为Model
直接绑定是标准的方法。这是我否认并试图用技术论据证明的。
基于我的MVC
、MVP
、Presentation Model
背景,对我来说使用ViewModel
是很自然的。 我可能错过了一个重要的点吗?
因此,对我来说,默认情况下绑定到ViewModel
,无论Model
是什么(无论它是否实现了INotifyPropertyChanged
)。
有几个原因我认为绑定到ViewModel
,包括(如这里提到的和另一篇文章中提到的)
1. 从视图中移除逻辑
- 使逻辑可单元测试
- 减少代码冗余(在需要重复时)
2. 安全性
- 模型包含用户不应更改的属性
- 如果绑定到模型,可能会发生自动但不想要的更新
3. 松耦合
- 如果直接将模型绑定,则较低层与视图之间存在耦合
- 更改模型会导致所有视图的更改
- 视图不依赖于任何给定模型
- 模型可以很容易地使用EF、某些DSL、批处理文件等生成
4. 开发速度
- 你可以从一个原型视图模型层次结构开始绑定到它
- 如果模型仍在开发中,您可以从一个原型模型开始
- 无论视图如何,模型和视图模型都可以进行测试驱动开发
- 视图可以完全由设计师或具有强大设计背景的开发人员构建
5. “棘手的同步”问题得到解决
- 对于任何给定的“棘手的同步”问题,有很多解决方案,例如:
- AutoMapper
- 来自模型的事件系统(模型触发事件,ViewModel订阅)
6. 项目中结构相等
- 有些地方必须使用ViewModel,例如SelectedItem
- 混合绑定到Model和ViewModel容易出错
- 新手开发人员更难弄清项目的结构
- 当别无选择时才开始引入ViewModel会很混乱
7. 可扩展性
- 让我们定义:如果您不使用ViewModel,则不是MVVM
- MVVM可以轻松适应许多数据源,许多视图
- 如果您发现任何性能问题:延迟加载和缓存进入ViewModel
8. 关注点分离
- 掌握复杂性是软件中的主要问题
- ViewModel的唯一责任是推送更改
- 向视图发送通知与将其推送到不同的进程或机器一样容易
- ViewModel而不是View在模型/数据源上注册更改通知
- 数据源可以忽略向导致更改的ViewModel发送事件
相反,来自另一个线程的人提出了一些观点,包括:
如果直接更新模型,视图模型将不知道触发属性更改事件。这会导致UI不同步。这严重限制了在父子视图模型之间发送消息的选项。
如果模型具有自己的属性更改通知,则问题#1和2不是问题。相反,您必须担心包装器VM超出范围但模型没有时的内存泄漏。
如果您的模型很复杂,拥有许多子对象,则必须遍历整个树并创建一个阴影第一对象图。这可能非常繁琐且容易出错。
包装集合尤其难以处理。任何时候都有东西(UI或后端)从集合中插入或删除项目,阴影集合都需要更新以匹配。这种代码真的很难写对。
因此,问题是:默认的绑定方式是什么,为什么?
我是否错过了使使用ViewModel成为必要的要点?
是否有任何真正的原因希望绑定到模型?
最重要的是为什么,而不是如何。