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