MVVM
MVVM
MVVM设计模式为何更便捷
WPF具有强大的数据绑定特性,提供了更简单的单向双向属性同步。你可以直接地把两个WPF元素绑定到一起,但是数据绑定更通用用法是绑定某种数据到View上。这是通过DataContext属性完成。因为DataContext属性被标记为继承,它可以设置在视图的根元素,继承给视图的所有孩子结点。
使用DataContext属性作为数据源的巨大限制是,它仅有一个。但是在真实的项目生命周期中每个视图通常有多个数据对象。所以我们可以怎么做?最显然的做法是把所有的数据对象聚合到单个对象中,并且将数据对象公开为属性。该数据对象被称为DataContext。
分隔逻辑和展示
目前为止,MVVM只是一种方便地将数据绑定到视图的设计模式。关于用户行为我们该怎么处理?经典到来,众所周知在WinForm注册事件处理器,通过视图的后端代码文件实现代码。这么做有以下几个缺点:
- 对于测试在后端代码中有事件处理器是不好的,因为你没法模拟视图
- 改变视图的设计通常需要改变后端代码,因为每个元素都有不同的事件处理器
- 逻辑与视图紧密耦合。不可能在其他视图重用该逻辑
因此,我们的想法是通过使用WPF的另一个功能,即命令(Command),将整个表示逻辑移动到ViewModel。命令可以像数据一样被绑定,而且被许多控件支持,比如按钮、切换按钮、菜单项、多选框等。目标是视图的后端代码中没有任何一行逻辑代码。这将会带给你以下有点:
- ViewModel可以更轻松地使用测试单元测试(而不是UI测试)
- 视图可以在不改变ViewModel的情况下被重新设计,因为其保持不变。
- ViewModel甚至可以被重复使用在某些特别的情况下(这通常是不被推荐的)
MVVM、MVP和MVC有何不同
MVP、MVC和MVVM设计模式之间的区别总是有许多结论。所以我尝试更加清楚地定义和区分它们。
MVC
MVC设计模式由一个直接地获取所有用户输入的控制器(Controller)组成。根据输入的种类,在视图中展示视图或者修改数据。实体和视图被控制器所创建。该视图只知道实体,但是实体不知道任何其他对象。这个设计模式通常被用于非常老的MFC中。
MVP
在MVP设计模式中,视图获取用户输入,并且转发到展示者中。根据用户行为的类型,该展示者修改视图或者模型。视图和战士之紧密相连。它们之间是双向一对一的关系。实体不知道展示者。视图它自己是被动的,这是为什么被叫做展示者模式,因为展示者推送数据到视图。这个设计模式通常监狱WinForms甚至更早的WPF应用中。
MVVM
MVVM设计模式是WPF通常所用的设计模式,他获取所有的用户输入并且转发它到ViewModel中(通常使用命令)。视图积极地使用数据绑定推送数据到ViewModel中。而实体不知道ViweModel。
MVVM框架
- Prism
- MVVM Light 已停更
- Microsoft.Toolkit.Mvvm
GalaSoft.MvvmLight
- ICleanup 实现该接口的ViewModel在Cleanup函数中释放资源
- ObservableObject 实现了INotifyPropertyChanged接口,可通知对象的基类
- ViewModelBase 继承自OBservaleObject、ICleanup,ViewModel基类 提供RaisePropertyChaneged供外部使用
- RelayCommand ICommand的实现 不带参数
- RelayCommand ICommand接口的泛型实现 带参数
- GalaSoft.MvvmLight.Messaging 提供全局的消息通知
- GalaSoft.MvvmLight.Ioc 依赖注入使用的容器
- EventToCommand 事件转命令

浙公网安备 33010602011771号