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

相关推荐
烛阴1 天前
从`new()`到`.DoSomething()`:一篇讲透C#方法与构造函数的终极指南
前端·c#
深海潜水员1 天前
【MonoGame游戏开发】| 牧场物语实现 第一卷 : 农场基础实现 (下)
vscode·游戏·c#·.net·monogame
合作小小程序员小小店1 天前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
大侠课堂1 天前
C#经典面试题100道
开发语言·c#
时光追逐者1 天前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
周杰伦fans2 天前
C# 正则表达式完全指南
mysql·正则表达式·c#
Triumph++2 天前
电器模C#汇控电子继块驱动(Modbus协议)
c#·visual studio·c#串口通信
咩图2 天前
C#创建AI项目
开发语言·人工智能·c#
周杰伦fans2 天前
C# - Task 是什么?想象一下你在餐厅点餐
服务器·开发语言·c#
一只小小汤圆2 天前
简化点集合 道格拉斯-普克算法(Douglas-Peucker Algorithm)
c#·occ