首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

WPF:MVVM的由来与属性绑定的过程

编程知识
2024年08月21日 18:43

WPF:MVVM的由来与属性绑定的过程

1、MVVM

(1)MVVM是什么?

​ MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式。有助于分离应用程序的业务逻辑和用户界面层,使得开发过程更易于管理,同时也便于单元测试。

image-20240821184048203

Model?

现实世界中对象的抽象结果。

View?

View=UI。

View Model?

ViewModel=Model for View。

View 与 View Model之间的沟通:传递数据:数据属性 传递操作:命令属性

(2)为什么要使用MVVM?

  • 可测试性:由于业务逻辑被封装在ViewModel中,这使得编写单元测试变得更容易。
  • 解耦:View和Model之间通过ViewModel间接通信,使得它们彼此独立,易于单独修改和维护。
  • 可维护性:清晰的分层结构使得代码更易于理解和维护。

2、数据绑定

现在我们做一个实验,实现一个简单的加法,通过MVVM去实现。

image-20240821185036615

从图中可以看出,有3个数据属性和2个命令属性。

先创建好各层文件夹如下:

image-20240821185305645

对于数据属性,我们先创建一个NotificationObject类,去继承INotifyPropertyChanged这个接口,这个接口用来是实现UI与数据属性之间双向绑定的

image-20240821190221001

对于命令属性,我们先创建一个DelegateCommand类,继承ICommand这个接口。

image-20240821190910144

ViewModel里面的代码如下:

image-20240821191133811

结果如下:

image-20240821191259007

3、分析

如何执行数据属性呢?(ViewModel与View之间双向交互)

数据绑定的过程,INotifyPropertyChanged里面接口是用来干嘛的?

当我们在UI层里面输入1时(此时对应的值已经传到了Input1了),这个时候会执行属性对应的Set里面的方法

image-20240821191524420

然后执行方法里面的事件,将这个属性名字传递到UI,然后UI绑定的对应的属性就随之改变

image-20240821191735106

也就是说:Input1和Inpu2我们只是通过UI去传值,所以我们并不需要去执行RaisePropertyChanged这个方法。于是,当我注释掉里面的RaisePropertyChanged方法时,经过调试与实验,依然可以显示结果。这个过程是从View到ViewModel的过程。

再来说Input3,这个为什么不可以去掉RaisePropertyChanged这个方法呢?因为当我们去执行命令后,Input3在ViewModel里面的值进行了改变,然后通过事件触发通知UI,传递给相对应的属性名字,这样UI层的值就改变了。这个过程是View Model到View的过程。

如何执行命令属性呢?(View到ViewModel)

我们知道,在MainWindow里面我们需要将xaml的上下文与View Model绑定

image-20240821193016065

然而在创建的ViewModel对象里面,就执行了这个命令属性吗?

image-20240821193148101

于是,经过调试,我发现在new完后并没有去触发委托里面的Add方法,这是为什么呢?

在初始化阶段,AddCommand被创建并设置好执行的动作(即Add方法),但这并不意味着Add方法被立即执行。只有当用户与UI进行交互时(比如点击按钮),AddCommand才会被触发,从而执行Add方法。
这里注意,命令属性的绑定方法:

image-20240821193627815

数据属性的绑定方法,比如文中的TextBox:

image-20240821193719987

From:https://www.cnblogs.com/zhuiyine/p/18372384
本文地址: http://www.shuzixingkong.net/article/1309
0评论
提交 加载更多评论
其他文章 P7706 文文的摄影布置 题解
P7706 文文的摄影布置 题解 原题 读完题,发现是线段树。单点修改+区间查询。 不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。 对于一个区间的待求值,大概有四种情况: 如上图四种情况分别为: 待求值最大值在左区间 待求值最大值在右区间 \(a_i与b_j\) 在左
P7706 文文的摄影布置 题解
目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频)
ByteTrack是字节跳动与2021年10月份公开的一个全新的多目标跟踪算法,原论文是《ByteTrack: Multi-Object Tracking by Associating Every Detection Box》。 ByteTrak的MOTA和FPS等指标上都实现了较好的性能,要优于现
目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频) 目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频) 目标追踪 ByteTrack 算法详细流程分析(看街拍追踪演示视频)
使用Packer构建镜像
什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像、Docker 镜像等。 Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜像的特征和要求。然后 Packer 使用这个配置文件来执行一系列的步骤,例如安装必要的软件、配置系统
使用Packer构建镜像 使用Packer构建镜像 使用Packer构建镜像
使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Refitter生成的客户端是Refit风格. 本人比较喜欢Refit风格的标注风格因此还是比较喜欢使用R
使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
代码随想录Day22
77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2: 输入:n = 1
代码随想录Day22
CVSS(Common Vulnerability Scoring System)打分规则解读
CVSS(Common Vulnerability Scoring System)提供了一种根据漏洞的主要特征进行打分,反映其严重性的方法。CVSS 已成为被广泛使用的标准。 下面是CVSS 3.1版本计算器的界面截图,本文对Base Score的打分标准做解读,并提供一些建议。同时会对每个维度选项
CVSS(Common Vulnerability Scoring System)打分规则解读
Python被远程主机强制关闭后怎么自动重新运行进程
要实现Python程序在被远程主机强制关闭后能够自动重新运行,我们可以采用几种方法,但最直接且常用的方法之一是结合操作系统级的工具或脚本。在Linux系统中,我们可以使用cron作业或者systemd服务来实现这一功能;在Windows系统中,可以使用任务计划程序。但在这里,为了提供一个跨平台的、更
使用FModel提取黑神话悟空的资产
目录前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook。 本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的基础使用流程,请见《使用FModel提取UE4/5游戏资产》 本文仅演示steam平台下的解包过程 设置 在FM
使用FModel提取黑神话悟空的资产 使用FModel提取黑神话悟空的资产 使用FModel提取黑神话悟空的资产