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 事件转命令
posted @ 2023-08-24 14:50  Juston007  阅读(61)  评论(0)    收藏  举报