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

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.pswp.cn/bicheng/83119.shtml

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

相关文章

使用PowerBI个人网关定时刷新数据

使用PowerBI个人网关定时刷新数据 PowerBI desktop连接mysql,可以设置定时刷新数据或在PowerBI服务中手动刷新数据,步骤如下: 第一步: 下载网关。以个人网关为例,如图 第二步: 双击网关,点击下一步&…

深度学习驱动的超高清图修复技术——综述

Deep Learning-Driven Ultra-High-Definition Image Restoration: A Survey Liyan Wang, Weixiang Zhou, Cong Wang, Kin-Man Lam, Zhixun Su, Jinshan Pan Abstract Ultra-high-definition (UHD) image restoration​​ aims to specifically solve the problem of ​​quali…

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景 1、网页存档与文档管理 需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。 2、电子报告生成 动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样…

电子邮箱设置SSL:构建邮件传输的加密护城河

在数字化通信高度依赖的今天,电子邮件作为企业协作与个人隐私的核心载体,其安全性直接关系到数据主权与商业利益。SSL(Secure Sockets Layer)作为网络通信加密的基石技术,通过为邮件传输建立加密隧道,有效抵…

Qt -使用OpenCV得到SDF

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 cv::MatdistanceTransform获得SDF 本文的目标, 是简单学习并使用OpenCV的相关函数, 并获得QImage的SDF(Signed Distance Field 有向距离场) 至…

Compose仿微信底部导航栏NavigationBar :底部导航控制滑动并移动

文章目录 1、准备工作1.1 参考1.2 依赖添加:1.3 主要控件NavigationBarHorizontalPager、VerticalPager 2、功能描述:3、实现过程3.1 创建一个数据类3.2 创建一个list变量3.3 具体实现3.3.1 创建共享的Pager状态3.3.2 将页面索引与页面标题同步3.3.3 创建…

WindowServer2022下docker方式安装dify步骤

WindowServer2022下docker方式安装dify步骤(稳定后考虑部署至linux中) 教程:https://blog.csdn.net/qq_49035156/article/details/143264534 0、资源要求 ---windows:8核CPU、16G内存、200G500G存储 ---10.21.31.122/administra…

【数据治理】要点整理-信息技术数据质量评价指标-GB/T36344-2018

导读:指标为数据质量评估提供了一套系统化、标准化的框架,涵盖规范性、完整性、准确性、一致性、时效性、可访问性六大核心指标,助力组织提升数据处理效率、支持决策制定及业务流程优化,确保数据在数据生存周期各阶段的质量可控。…

前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。 一、核心功能架构 我们将实现以…

通信算法之280:无人机侦测模块知识框架思维导图

1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计

单片机寄存器的四种主要类型!

1. 控制寄存器&#xff08;Control Registers&#xff09;​​ ​​专业定义​​&#xff1a;用于配置硬件行为或触发操作的寄存器。 ​​大白话​​&#xff1a; 相当于设备的​​“控制面板”​​&#xff0c;通过写入特定值来​​开关功能​​或​​调整参数​​。例如&am…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战&#xff1a;误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码&#xff0c;效果还不错。 下面上R语言代码&#xff0c;以Xgboost为例&#xff1a; # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…

HTML Day04

Day04 0.引言1. HTML字符实体2. HTML表单2.1 表单标签2.2 表单示例 3. HTML框架4. HTML颜色4.1 16进制表示法4.2 rgba表示法4.3 名称表达法 5. HTML脚本 0.引言 刚刚回顾了前面几篇博客&#xff0c;感觉写的内容倒是很详细&#xff0c;每个知识点都做了说明。但是感觉在知识组织…

comfyui 工作流中 视频长度和哪些参数有关? 生成15秒的视频,再加上RTX4060 8G显卡,尝试一下

想再消费级显卡上生成15秒长视频&#xff0c;还是比较慢的&#xff0c;不过动漫的画质要求比较低 在ComfyUI中生成15秒视频需综合考虑视频参数配置、模型选择和硬件优化&#xff0c;尤其针对RTX 4060 8G显存的限制。 ⏱️ 一、影响视频长度的核心参数 总帧数&#xff08;video_…

Netty 实战篇:构建高性能聊天服务器

在前两篇文章中&#xff0c;我们深入探讨了 Netty 的 IO 模型以及其核心组件的工作原理。本篇文章将通过一个实际的聊天服务器示例&#xff0c;展示如何使用 Netty 构建高性能的网络应用。 一、项目结构 项目主要包含以下几个部分&#xff1a; ChatServer&#xff1a;服务器启…

智绅科技——科技赋能健康养老,构建智慧晚年新生态

当老龄化浪潮与数字技术深度碰撞&#xff0c;智绅科技以 “科技赋能健康&#xff0c;智慧守护晚年” 为核心理念&#xff0c;锚定数字健康与养老服务赛道&#xff0c;通过人工智能、物联网、大数据等技术集成&#xff0c;为亚健康群体与中老年人群构建 “监测 - 预防 - 辅助 - …

Tkinter软件——显示txt标签的目标水平边框图像

代码&#xff1a; import tkinter as tk from tkinter import filedialog from tkinter import messagebox import cv2 from PIL import Image, ImageTk import osclass ImageBoxApp:def __init__(self, master):self.master masterself.master.title("Image Box Drawer…

Linux 文件覆盖机制与实践:以 mv 命令为切入点

引言&#xff1a;文件覆盖的本质 文件覆盖是 Linux 文件系统中常见的操作&#xff0c;指的是在目标路径已存在文件的情况下&#xff0c;将源文件的内容写入目标文件&#xff0c;导致目标文件的原有内容被替换。在 Linux 中&#xff0c;文件覆盖通常通过命令行工具&#xff08;…

学习路之PHP--easyswoole操作数据库

学习路之PHP--easyswoole操作数据库 0、安装orm插件一、创建数据库二、创建模型三、控制器显示四、效果五、问题 0、安装orm插件 composer require easyswoole/orm一、创建数据库 表&#xff1a; CREATE TABLE cases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,titl…

手写multi-head Self-Attention,各个算子详细注释版

文章目录 MultiHeadAttentionFormal的实现操作详解1. &#x1f50d; attention_mask2. &#x1f50d; matmul✅ 其他实现方式1. 使用 运算符&#xff08;推荐简洁写法&#xff09;2. 使用 torch.einsum()&#xff08;爱因斯坦求和约定&#xff09;3. 使用 torch.bmm()&#xf…