简述WPF中MVVM的设计思想

近年来,随着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的设计思想,验证上述的理论知识,以实例进行说明。本实例的项目架构如下所示:

相关推荐
唐青枫3 小时前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
我好喜欢你~10 小时前
C#---StopWatch类
开发语言·c#
一阵没来由的风13 小时前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
✎ ﹏梦醒͜ღ҉繁华落℘16 小时前
开发WPF项目时遇到的问题总结
wpf
一枚小小程序员哈20 小时前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
Eternity_GQM21 小时前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word
cimeo1 天前
【C 学习】06-算法&程序设计举例
c#
百锦再1 天前
.NET 的 WebApi 项目必要可配置项都有哪些?
java·开发语言·c#·.net·core·net
WYH2872 天前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#
hqwest2 天前
C#WPF实战出真汁06--【系统设置】--餐桌类型设置
c#·.net·wpf·布局·分页·命令·viewmodel