近年来,随着WPF在生产、制造、工控等领域应用越来越广泛,对WPF的开发需求也在逐渐增多,有很多人不断的从Web、WinForm开发转向了WPF开发。
WPF开发有很多新的概念及设计思想,如数据驱动、数据绑定、依赖属性、命令、控件模板、数据模板以及MVVM模式等等,与传统的WinForm、ASP.NET WebForm开发有很大差异。
下面将简述WPF开发中MVVM的设计思想以及应用。
一、为什么要用MVVM?
传统WinForm开发的特点如下:
(1)一般采用事件驱动,也即用户点击事件,触发对应的事件
(2)通过唯一标识符获取页面上用户输入的数据进行业务逻辑处理
(3)用户输入(User Interface)和业务逻辑(Business)是紧密耦合在一起的,无法做到分离
(4)随着项目业务不断复杂化,这种高度耦合会出现前后端分工不明确,工作无法拆分的现象
因此,分层(如:MVC、MVVM),前后端分离,就成为必须面对的问题。
二、什么是MVVM?
MVVM是Model-VIew-ViewModel的简称,顾名思义模型-视图-视图模型,是一种用于解耦用户界面与业务逻辑的一种设计模式。借助于MVVM,可以在XAML中以声明方式定义UI,将UI使用数据绑定标到包含数据和命令的其它层。数据绑定提供数据和结构的松散耦合,使得UI和链接的数据保持同步,同时可以将用户输入路由到相应的命令。具体如下图所示:
1、View(用户界面):主要用于向使用者展示信息,并接收用户输入的信息(数据绑定)及响应用户的操作(Command);
2、ViewModel(用户视图业务逻辑):主要处理客户请求以及数据呈现;
3、Model(数据模型):作为存储数据的载体,是一个个具体的模型类,通过ViewModel进行调用,但在小型项目中,Model并不是必须的;
4、IService(数据接口):数据访问服务,用于获取各种类型数据的服务。数据的形式有很多种,如网络数据、本地数据、数据库数据,但在ViewModel调用时,都统一封装成了Service。在小型项目中,IService数据接口也不是必须的,不属于MVVM的范畴;
5、上图中,DataBase、Network、Local等标识不同的数据源形式,并不属于MVVM的范畴。
三、实现MVVM的前提条件
1、属性变更他通知:在MVVM思想中,由WinForm的事件驱动转变成了数据驱动。在C#中,普通的属性,并不具备变更通知功能,要实现变更通知功能,必须要实现INotifyPropertyChanged接口;
2、绑定命令:在WPF中,为了解决事件响应功能之间的耦合,提出了绑定命令思想,即命令可以以绑定的方式与控件建立联系,绑定命令必须实现ICommand接口;
在上述两个条件都满足后,如何将VIewMode中的具备变更通知的属性和命令,与View中的控件关联起来呢?答案是绑定(Binding)。
当View层的数据控件和具备通知功能的属性进行Binding后,Binding就会自动侦听来自接口的PropertyChanged事件,进而达到数据驱动UI的效果,可为"一桥飞架通南北,天堑变通途"。
四、MVVM实例
为了进一步感受MVVM的设计思想,验证上述的理论知识,以实例进行说明。本实例的项目架构如下所示: