WPF【11_4】WPF实战-重构与美化(MVVM 架构)

news2025/5/30 19:02:53

11-9 【理论】MVVM 架构

在 WPF 项目中,我们主要采用的是一种类似 MVC 的架构,叫做 MVVM。 MVVM 继承了 MVC 的理念,是 Model-View-ViewModel 的缩写,中文意思是模型、视图、视图模型。这三个词分开看我们都能看懂,不过合在一起是什么意思呢?

既然合在一起看不懂,咱们还是分开来解释吧。

什么是MVVM示例图

    首先, View。 
    当我们创建一个新的 WPF 项目的时候,首先打开的是什么呢?是这个界面设计页面, MainWindow.xaml 文件,没错吧?那这个 xaml 是干什么用的呢?它就是用来与 UI, 与用户界面打交道的文件。在这个文件中,所有的设计元素、 UI 组件、代码全部都可以看作视图(View)。
    所以说我们的视图不仅包含 UI 界面,还包含了这个界面中所涉及的代码逻辑。因此在 WPF 项目中, xaml 文件件以及 xaml.cs 文件,都可以被我们称作视图。在一个视图中,我们可以创建文本框、 TextBox、 DatePicker、 Button 等等各种各样的组件。而支撑这个视图的数据则来自数据模型(Model)。 
    比如说我们的 WPF 项目有两个部分的数据,客户的姓名以及预约数据。而这些数据分别对应的也正是我们数据库中的两张表。所有的数据定型和结构化处理都是由这个模型来完成的。在视图中,我们可以根据模型的字段来显示和更新数据。比如说客户模型,我们需要包含他的姓名、身份证、住址等等信息。而预约模型应该包含客户的 ID、 预约时间等等。
    虽然对于一个 WPF 项目来说,仅仅使用 Model 和 View, 甚至只使用 View 也能完成各种各样复杂的功能,比如说上一章我们的实战项目只有 View, 同样也可以完成客户预约系统的开发。但是直接从视图访问数据库是一种比较低级的开发方式,我们无法对数据进行隔离,无法进行复杂的业务开发,甚至无法可持续的维护系统。
    所以我们必须要进行业务与数据的隔离,以及业务与界面的隔离。根据上述的原则,对于业务进行分离后,我们就得到了视图模型。客户视图模型对应的就是客户模型。视图模型可以全部或者部分使用模型的字段。模型的字段通过映射的方式向视图模型提供数据支持。而视图模型与视图则是双向绑定,不仅可以让用户看到数据,还可以通过 UI 交互操作数据。
    而视图模型作为业务逻辑的载体,也会承担与数据库的沟通工作。
    比如说, UI 上面有两个按钮,分别是刷新客户信息和保存客户信息。点击刷新, UI 则会通过发送事件的方式通知视图模型,而视图模型在收到刷新请求以后,就会去数据库提取数据,然后重新把数据提供给视图。如果用户点击了保存信息的按钮,那么视图模型同样会接收到更新事件,然后会把 UI 上用户输入的数据提交给数据库,完成数据的更新。而最后我们的视图模型则会处理一切与 UI 的交互行为。

什么是MVVM示例图2

    所以简单来说, MVVM 架构就是由视图、模型以及视图模型构成。视图模型访问数据库提取数据,通过使用模型来对象化数据,然后把数据绑定给 UI,也就是视图。而视图则处理一切与用户的交互,并且把用户数据反馈给视图模型,由视图模型的业务规则来提供下一步的处理。最后,视图与模型之间由于加入了视图模型,所以产生了系统的分层,而数据也得到了有效的隔离,它们之间则是一个间接引用的关系。

那么 MVVM 架构有什么优点呢?
  ·兼容MVC架构
  ·方便测试
  ·方便维护

第一,我们之前说过 MVVM是一种脱胎于 MVC 的架构,可以说是 MVC 的升级。所以 MVC 架构的项目可以非常轻松移植到 MVVM。 
第二,在 MVVM 里面, Controller 不再与 Model 进行绑定了,而通过 ViewModel 使用 Model 进行数据的对象化处理,所以业务与 UI 逻辑彻底分开,减轻了测试压力。如果有 iOS 开发经历,就会感觉到自从 Xcode 7 开始。 iOS 的测试变得越来越完善了。
第三,因为业务、 UI 数据全部独立,所以不管是未来的维护还是系统升级都是非常舒服的。


当然, MVVM 也不是万金油,它也有缺点。
  ·代码量增加
  ·对象调用复杂度增加

比如说使用它,代码量会有明显的增加,这一点在接下来的课程中就会看到。而且对象的调用也会比较复杂,…… 不用太担心!


 

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

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

相关文章

计算逆时针夹角(有向角度)——CAD c# 实现两条线(向量)的逆时针夹角

效果如下: 附部分代码如下: public void 逆时针夹角Demo(){// 获取当前 CAD 文档和编辑器Document doc Application.DocumentManager.MdiActiveDocument;Editor ed doc.Editor;Database db doc.Database;try{Point3d vec1Start, vec1End;if (!GetTwoP…

【Linux】进程 信号的产生

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、掌握Linux信号的基本概念 🌠前台进程 VS 后台进程 🌠 小贴士: 🪄⼀个系统函数 --- signal() 🪄查看信号 --- man 7 sign…

机器学习中的维度、过拟合、降维

1. 维度灾难 当我们谈论机器学习模型在处理数据时遇到的困难,一个常常被提及的词便是“维度灾难”(Curse of Dimensionality)。这不是科幻小说里的情节,而是数学和计算世界里真实存在的困境。它指的正是:当数据集的特…

关于git的使用

下载git 可以去git的官网下载https://git-scm.com/downloads 也可以去找第三方的资源下载,下载后是一个exe应用程序,直接点开一直下一步就可以安装了 右键任意位置显示这两个就代表成功,第一个是git官方的图形化界面,第二个是用…

预约按摩小程序源码介绍

基于ThinkPHP、FastAdmin和UniApp开发的预约按摩小程序源码,ThinkPHP作为后端框架,以其高效稳定著称,能妥善处理数据逻辑与业务规则。FastAdmin作为后台管理框架,极大简化了后台管理系统的搭建与维护。UniApp则让小程序具备跨平台…

Elasticsearch创建快照仓库报错处理

创建快照仓库报错: 根据报错提示的信息,问题可能出在 Elasticsearch 的配置中。当你尝试创建一个文件系统(fs)类型的快照仓库时,虽然已经指定了 location 参数,但 Elasticsearch 仍然报错,这通…

使用DDR4控制器实现多通道数据读写(十三)

一、概述 在上一章节中使用仿真简单验证了interconnect的功能,使用四个axi4的主端口同时发起读写命令,经过interconnect后,将这些读写指令依次发给ddr4控制器。Ddr4控制器响应后再依次将响应发送到各个通道。从而实现多通道读写ddr4控制器的功…

谷歌Veo vs Sora:AI视频生成技术的巅峰对决

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——从架构到实践,解析音画同步、物理模拟与长视频生成的破局之战 一、技术架构:双雄对垒,殊途同归? 谷歌…

基于Spring boot+vue的中医养生系统的设计与实现(源码+论文+部署+安装+调试+售后)

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统背景 在健康中国战略持续推进与全民健康意识显著提升的时代背景下,中医养生作为中…

31.第二阶段x64游戏实战-封包-线程发包

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:30.第二阶段x64游戏实战-认识网络数据包发送流程 代码跳转 ws2_32.send跳转sen…

Unity数字人开发笔记

开源工程地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit 先致敬zhangliwei7758,开放这个源码 一、建立工程 建立Unity工程(UnityAiChat)拖入Unity-AI-Chat-Toolkit.unitypackage打开chatSample工程,可…

嵌入式开发--STM32G431无法正常运行程序,BOOT0与CAN冲突

故障现象 今天开发STM32G431时遇到一个问题,板子打样回来后,焊接完成,可以烧程序,可以读FLASH,却死活不能运行,也不能进仿真调试。 故障定位 经过排查,发现将隔离芯片π121M31拆除&#xff0…

程序环境与预处理

一、程序的翻译环境和执行环境 翻译环境:将源代码转化为可执行的机器指令 执行环境:执行代码 1、翻译环境 流程: 二、运行环境 程序执行过程: 三、预编译阶段 1、预定义符号 __FILE__ //进行编译的原文件名 __LINE__ //文…

《Java 单例模式:从类加载机制到高并发设计的深度技术剖析》

【作者简介】“琢磨先生”--资深系统架构师、985高校计算机硕士,长期从事大中型软件开发和技术研究,每天分享Java硬核知识和主流工程技术,欢迎点赞收藏! 一、单例模式的核心概念与设计目标 在软件开发中,我们经常会遇…

全志F1c200开发笔记——移植根文件系统

1.下载buildroot Index of /downloads/ 使用2018.02.11版本 直链下载 https://buildroot.org/downloads/buildroot-2018.02.11.tar.gz 2.配置 进入buildroot压缩包目录下,使用命令解压并进入工作目录 tar -xf buildroot-2018.02.11.tar.gz cd buildroot-2018.…

[yolov11改进系列]基于yolov11引入自注意力与卷积混合模块ACmix提高FPS+检测效率python源码+训练源码

[ACmix的框架原理] 1.1 ACMix的基本原理 ACmix是一种混合模型,结合了自注意力机制和卷积运算的优势。它的核心思想是,传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影,生成一组…

Java NIO编程:构建高性能网络应用

1.Java NIO 核心概念与架构 1. 传统 BIO 与 NIO 的对比 特性 BIO (Blocking I/O) NIO (Non-blocking I/O) I/O 模型 阻塞 非阻塞 / 异步 线程模式 每个连接一个线程 单线程管理多个连接 数据处理单位 字节流 / 字符流 缓冲区 (Buffer) 核心组件 Socket, ServerSoc…

如何实现高性能超低延迟的RTSP或RTMP播放器

随着直播行业的快速发展,RTSP和RTMP协议成为了广泛使用的流媒体传输协议,尤其是在实时视频直播领域,如何构建一个高性能超低延迟的直播播放器,已经成为了决定直播平台成功与否的关键因素之一。作为音视频直播SDK技术老兵&#xff…

C语言数据结构-单向链表

头文件&#xff1a;link.h #ifndef __LINK_H__ #define __LINK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /*节点数据类型*/ typedef struct node { DataType data; //数据域 struct node *pNext; //指…

小样本分类新突破:QPT技术详解

问题导向式提示调优(QPT) 这篇论文主要讲了一个针对小样本(数据量少)文本分类问题的新方法,叫问题导向式提示调优(QPT)。 核心思路是让预训练语言模型(比如BERT的升级版RoBERTa)在少量标注数据下,通过设计特定的“提问式模板”和“标签词扩展技术”来提升分类效果。…