简述WPF中MVVM的设计思想

news2025/4/28 6:46:34

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1086790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 配置静态IP脚本

静态IP配置方法: 1、新建一个txt文本,加入以下代码 netsh interface ip set address name"以太网" sourcestatic addr192.168.101.11 mask255.255.255.0 gateway192.168.101.12、将TXT另存为ANSI编码!将TXT另存为ANSI编码&#x…

2023年中国舞台烟雾机产量、销量及市场规模分析[图]

舞台烟雾机是一种用于舞台表演和演出的设备,它能够产生各种形式的烟雾效果,以增强舞台表演的视觉效果和氛围。舞台烟雾机通常由气泵、烟雾发生器、控制器和烟雾管道等组成,可以通过控制器调节烟雾的浓度、颜色和流量,以满足不同演…

C++ 位图与布隆过滤器

目录 前言位图场景演示应用场景模拟实现问题例题 布隆过滤器例子理解应用 例题 前言 位图与布隆过滤器是用来在海量数据中判断一个数据在不在的问题的数据结构,这种数据结构在存储空间上大大的优于红黑树、哈希等数据结构 位图 我们为了处理一个数据在海量数据中…

Linux CentOS8安装gitlab_ce步骤

1 下载安装包 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm/download.rpm2 安装gitlab yum install policycoreutils-python-utilsrpm -Uvh gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm3 更新配…

Gpt-4多模态功能强势上线,景联文科技多模态数据采集标注服务等您来体验!

就在上个月,OpenAI 宣布对ChatGPT 进行重大更新,该模型不仅能够通过文字输入进行识别和分析,还能够通过语音、图像甚至视频等多种模态的输入来获取、识别、分析和输出信息。这一重要技术突破,将促进多模态自然语言处理的发展&…

ESP32-WROOM-32无法进入下载模式进行程序上传的问题

结论 先说结论,ESP32-WROOM-32无法进入下载模式通过串口进行程序上传,可能是GPIO2引脚没有通过下拉电阻拉低,导致无法进入正确的启动模式。 启动模式 ESP32启动时会打印rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) 复位源rs…

mysql面试题49:MySQL中不同text数据类型的最大长度

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL中TEXT数据类型的最大长度 在MySQL中,TEXT数据类型用于存储较大…

idea怎么设置作者信息(详细)

目录 一:在Java类的开头自动注释作者名字和日期等信息 二:给Java的方法注释作者名字和日期等信息 1. 不可修改的模板:Postfix Completion 2. 可修改的模板:Live Templates tips:首先给大家推荐两款好用的免费软件&…

【Linux】多进程编程

目录 1. 进程基础知识 2. 查看进程 3. 杀死进程 4. 获取进程标识符 5. 进程创建 6. 进程终止 7. 进程等待 8. 进程程序替换 9. 进程间通信之管道 9.1 匿名管道 9.2 命名管道(FIFO) 10. 进程间通信之共享内存 11. 进程间通信之信号 11.1 Li…

Linux传统跨进程通信原理

文章目录 前言一、进程隔离二、进程空间划分:用户空间(User Space)/内核空间(Kernel Space)三、系统调用:用户态与内核态四、Linux下传统IPC跨进程通信原理1、发送进程通过系统调用,将需要发送的数据拷贝到Linux进程的内核空间中的缓存区(数据…

百度智能云千帆大模型平台 2.0 产品技术解析

本文整理自 2023 年 9 月 5 日百度云智大会 - 智能计算&大模型技术分论坛,百度智能云 AI &大数据平台总经理忻舟的主题演讲《百度智能云千帆大模型平台 2.0 产品技术解析》。 这是关于技术主题的论坛,我首先问大家三个开发者的小问题。 第一个问…

tez作业运行慢

文章目录 问题现象:排查思路查看task运行概况查看map和reduce container的日志初步结论 继续排查container数量差异大分片计算异常 结论 问题现象: 每天调度的一个任务在某天突然运行时长多了好几倍,平时30m左右,那天运行了4个小…

Ubuntu 22.04‘Temporary failure resolving‘ 解决方案

终极解决方案 首先安装resolvconf sudo apt-get install resolvconf 使用 cd /etc/resolvconf/resolv.conf.d/ 进入文件夹,使用 ls 查看目录,会显示 base head tail 使用 sudo vim base 编辑base文件, 进入时为空,点击 i 添加 …

【架构艺术】(零) 环境搭建

写在前面 今天尝试了如systemC,Chisel,MyHDL等方式来进行功能仿真,并生成波形到Wavedrom格式,后来发现对于学习这些简单架构,还是脑子里面根据规则进行仿真或者是编写verilog代码进行仿真即可。 所以我们的环境依赖只有:安装waved…

【PostgreSQL启动,停止命令(重启)】

找到 /usr/lib/systemd/system文件夹路径看是否包含 postgresql服务 关闭服务: systemctl stop postgresql-12.service启动服务 systemctl start postgresql-12.service重启服务 systemctl restart postgresql-12查看状态 systemctl status postgresql-12.servi…

区分Cookie,Session,Token

Cookie 由于HTTP 协议是一个无状态协议,客户端向服务器发请求,服务器返回响应。并且你每次都要输入账号和密码进行登录,对于用户来说非常的麻烦!这种背景下,就产生了 Cookie cookie 存储在客户端: cookie…

Essential Steps in Natural Language Processing (NLP)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

C语言 | 浮点数在内存中存储方式

浮点数其实在内存中也是以2进制的形式存储的,但是它不是以原码、反码、补码的形式存储的。 常见的浮点数: 3.14159 1E10【科学计数法1.0*10^10】 eg:1.2312.3*10^-10.123*10^1 浮点数家族包括:float、double、long double类型…

C语言水平测试题 过关斩将(3)辗转相除法,前n项求和,整数的正序分解,求最大公约数

我的个人主页:☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主 欢迎各位 👍点赞 ⭐收藏 📝评论 我的专栏:C语言基础语法(超详细)_☆光之梦☆的博客-CSDN博客(这…

Linux 部署 GitLab idea 连接

概述 GitLab 是一个开源的代码管理平台,使用 Git 作为版本控制工具,提供了 Web 界面和多种功能,如 wiki、issue 跟踪、CI/CD 等。 GitLab 可以自托管或使用 SaaS 服务,支持多种操作系统和执行器。 GitLab 可以帮助软件开发团队…