一文读懂WPF系列之MVVM
WPF MVVM
- 什么是MVVM
- WPF为何使用MVVM机制
- WPFMVVM 的实现手段
- INotifyPropertyChanged
- 数据绑定的源端通知
- 原理 PropertyChanged事件
- 双向绑定的完整条件
- 常见疑惑问题
什么是MVVM
翻译全称就是 model-view-viewmodel 3部分内容
-
以wpf的概念角度来解释就是 数据库数据源模型----xmal UI视图----DataContext Viewmodel使用模型承载方式
-
以技术点的角度来解释就是通过 UI的依赖属性 - binding-ViewModel 数据之间 双向绑定
UI控件内容变动可以作用于viewmodel,viewmodel模型内容变动也可以作用于UI控件内容显示
WPF为何使用MVVM机制
- 职责分离
View:仅负责 UI 呈现,通过 XAML 绑定依赖属性。
ViewModel:处理业务逻辑,通过 INotifyPropertyChanged 驱动数据流。
Model:封装数据结构和业务规则。 - 可测试性与维护性
ViewModel 独立于 UI,便于单元测试。
样式与逻辑解耦,支持设计师与开发者并行工作
WPFMVVM 的实现手段
在 WPF 中,依赖属性、数据绑定和 INotifyPropertyChanged 是支撑 MVVM(Model-View-ViewModel)设计模式的三大核心
- 依赖属性与 View 的绑定
自定义控件:通过依赖属性定义控件行为(如 NumericBox.Value),并绑定到 ViewModel 属性。
数据模板:在控件模板中使用 TemplateBinding 关联依赖属性与模板元素。 - INotifyPropertyChanged 与 ViewModel 的绑定
数据驱动 UI:ViewModel 的 CLR 属性通过 INotifyPropertyChanged 实现双向绑定,例如用户输入实时同步到数据源。
工具辅助:使用 Fody 库的 [ImplementPropertyChanged] 特性自动生成属性变更代码,减少样板代码。 - 数据绑定引擎的协作
绑定模式:
单向绑定(OneWay):依赖属性监听 ViewModel 属性变化。
双向绑定(TwoWay):依赖属性与 ViewModel 属性互相更新,例如 TextBox.Text 与 ViewModel.InputText。
验证与转换:通过 IValueConverter 和 ValidationRule 实现数据格式转换与输入验证
INotifyPropertyChanged
数据绑定的源端通知
ViewModel 的职责:ViewModel 中的 CLR 属性需实现 INotifyPropertyChanged,以便在值变更时通过 PropertyChanged 事件通知 UI 更新
public class ViewModel : INotifyPropertyChanged {private string _userName;public string UserName {get => _userName;set { _userName = value; OnPropertyChanged(nameof(UserName)); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}<TextBox Text="{Binding UserName, Mode=TwoWay}" />
原理 PropertyChanged事件
- INotifyPropertyChanged 是一个接口,定义了一个 PropertyChanged 事件
- 当 ViewModel 中的属性值发生变化时,触发 PropertyChanged 事件,并传递属性名称。
- WPF 的绑定引擎会监听此事件,并根据属性名称更新对应的 UI 元素
双向绑定的完整条件
- 目标属性是依赖属性(如 TextBox.Text)。
- 源属性实现 INotifyPropertyChanged(ViewModel 属性)。
- 显式设置 Mode=TwoWay(除非依赖目标属性默认支持双向)。
- 更新触发时机:通过 UpdateSourceTrigger 控制同步时机(如 PropertyChanged 或 LostFocus)
常见疑惑问题
- 如果没有用到INotifyPropertyChanged,即使binding 设置了 twoway 也无法viewmodel变更后 作用UI显示
- 绑定不更新
可能原因:
未正确调用 OnPropertyChanged。
属性名称拼写错误(使用 nameof 避免)。
未启用 Mode=TwoWay(如需要从 View 更新到 ViewModel) - 目前DataContext是通过=this的写法 来表现数据源的,无法使用mvvm 所以为什么推荐使用 viewmodel的写法来使用,DataContext = this 的适用场景:仅适用于原型验证或极小规模工具,不推荐生产环境使用
- 在 WPF 中,若绑定模式设置为 OneWay,且 ViewModel 实现了 INotifyPropertyChanged 接口,数据源的变更会触发 UI 更新,但 UI 的修改不会反向同步到数据源
相关文章:
一文读懂WPF系列之MVVM
WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged数据绑定的源端通知原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…...
【Unity】打包TextMeshPro的字体
前言 在Unity中,TextMeshPro与常规 Text 组件相比提供了更高级的文本呈现功能,TextMesh Pro 可以处理各种语言,包括中文。我们可以轻松地在 Unity 项目中使用中文,而不必担心字体和布局问题。TextMeshPro需要的字体资源就需要我们…...
51单片机实验五:A/D和D/A转换
一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC)、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念:模数转换是将连续的模拟信号转换为离散的数字信…...
使用VHD虚拟磁盘安装双系统,避免磁盘分区
前言 很多时候,我们对现在的操作系统不满意,就想要自己安装一个双系统 但是安装双系统又涉及到硬盘分区,非常复杂,容易造成数据问题 虚拟机的话有经常用的不爽,这里其实有一个介于虚拟机和双系统之间的解决方法,就是使用虚拟硬盘文件安装系统. 相当于系统在机上…...
Kafka消费者端重平衡流程
重平衡的完整流程需要消费者 端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。在消费者端,重平衡分为两个步骤:分别是加入组和等待领导者消费者(Leader Consumer)分配方案。这两个步骤分别对应两类…...
Django之modelform使用
Django新增修改数据功能优化 目录 1.新增数据功能优化 2.修改数据功能优化 在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。 我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html…...
云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》
2025年4月8日至9日,中国人工智能产业发展联盟(以下简称AIIA)第十四次全体会议暨人工智能赋能新型工业化深度行(南京站)在南京召开。工业和信息化部科技司副司长杜广达,中国信息通信研究院院长、中国人工智能…...
写论文时降AIGC和降重的一些注意事项
‘ 写一些研究成果,英文不是很好,用有道翻译过来句子很简单,句型很单一。那么你会考虑用ai吗? 如果语句太正式,高级,会被误判成aigc ,慎重选择ai润色。 有的话就算没有用ai生成,但…...
AI 编程工具—如何在 Cursor 中集成使用 MCP工具
AI 编程工具—如何在 Cursor 中集成使用 MCP工具 这里我们给出了常用的MCP 聚合工具,也就是我们可以在这些网站找MCP服务 这是一个MCP Server共享平台,用户可以在上面发布和下载MCP Server配置。在这里可以选择你需要的MCP 服务。 如果你不知道你的mcp 对应的server 名称也不…...
基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)
文章目录 动态规划前言线性dp路径类dp经典线性dp背包问题分类01背包问题完全背包问题多重背包分组背包问题混合背包问题多维费用的背包问题区间dp 动态规划 前言 在竞赛中,如果遇到动态规划的题目,只要不是经典题型,那么大概率就是以压轴题的…...
MLLMS_KNOW尝鲜版
背景(个人流水账,可毫不犹豫跳过) 最近项目中有涉及到小物体检测的内容,昨天晚上讨论的时候有提出是否可以将关注区域放大的idea,不过后来没有就着这个东西深入,结果好巧不巧地,今天关注到这篇…...
《软件设计师》复习笔记(12.2)——成本管理、配置管理
目录 一、项目成本管理 1. 定义 2. 主要过程 3. 成本类型 4. 其他概念 真题示例: 二、软件配置管理 1. 定义 2. 主要活动 3. 配置项 4. 基线(Baseline) 5. 配置库类型 真题示例: 一、项目成本管理 1. 定义 在批准…...
《AI赋能职场:大模型高效应用课》第8课 AI辅助职场沟通与协作
【本课目标】 掌握AI辅助邮件、沟通话术的优化技巧。学习利用AI快速生成高效的会议纪要。通过实操演练,提升职场沟通效率与协作能力。 【准备工具】 DeepSeek大模型(deepseek.com)百度文心一言(yiyan.baidu.com) 一…...
Spring 中的 @Cacheable 缓存注解
1 什么是缓存 第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。 对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的…...
settimeout和setinterval区别
1. setTimeout:单次延迟执行 语法: const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能:在指定的 delay(毫秒)后,执行一次 callback 函数。 参数: callback&#x…...
UE5编辑器静止状态下(非 Play 模式)睫毛和眼睛的渲染是正常的,而在 Play 模式下出现模糊
这通常指向以下几个 运行时(Runtime) 特有的原因: 抗锯齿 (Anti-Aliasing) 方法,特别是 Temporal Anti-Aliasing (TAA): 这是最可能的原因。 UE5 默认启用的 TAA 通过混合多帧信息来平滑边缘和减少闪烁,尤其是在运动中…...
怎样选择适合网站的服务器带宽?
合适的服务器带宽对于网站的需求起着至关重要的作用,服务器带宽会直接影响到网站的访问速度和用户体验,本文将介绍一下企业该怎样选择适合网站需求的服务器带宽! 不同类型的网站对于服务器带宽的需求也是不同的,小型博客网站的访问…...
Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制
本报告对Microsoft最新推出的Recall功能进行了全面隐私与安全分析。Recall是Windows 11 Copilot电脑的专属AI功能,允许用户以自然语言搜索曾在电脑上查看过的内容。该功能在初次发布时因严重隐私和安全问题而备受争议,后经微软全面重新设计。我们的分析表…...
linux 4.14内核jffs2文件系统不自动释放空间的bug
前段时间在做spi-nor flash项目的时候,使用jffs2文件系统,发现在4.14内核下存在无法释放空间的bug,后来进行了修复,修复后功能正常,现将修复patch公开,供后来者学习: diff --git a/fs/jffs2/ac…...
Thymeleaf简介
在Java中,模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf 和 JSP比较: Thymeleaf目前所作的工作和JSP有相似之处,Thyme…...
uniapp中uni-easyinput 使用@input 不改变绑定的值
只允许输入数字和字母 使用input 正则replace后赋值给A 遇到问题: 当输入任意连续的非法字符时, 输入框不变. 直到输入一个合法字符非法字符才成功被过滤. <uni-forms-item label"纳税人识别号" name"number"><uni-easyinput v-model"numb…...
前端零基础入门到上班:Day7——表单系统实战全解析
🧩前端零基础入门到上班:Day7——表单系统实战全解析 ✅ 目标:不仅掌握 HTML 表单标签,更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动,为后续接入 Vue、后端接口打下坚实基础。 🌟 一、HTML 表…...
【特殊场景应对1】视觉设计:信息密度与美学的博弈——让简历在HR视网膜上蹦迪的科学指南
写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…...
o3和o4-mini的升级有哪些亮点?
ChatGPT是基于OpenAI GPT系列的高性能对话生成AI,经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中,OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本,为不同使用场景提供灵活选择。 随着用户需求向更高效、更精准的推理和视觉…...
影楼精修行业浅见-序言
影楼及商业摄影行业对高效、智能化的图像精修需求日益增长。传统修图流程耗时长、人工成本高,且修图师水平参差不齐影响最终成片质量。AI驱动的影像精修软件通过自动化、批量处理和智能算法,显著提升了修片效率和一致性,成为影楼数字化升级的…...
MATLAB 控制系统设计与仿真 - 36
鲁棒工具箱定义了个新的对象类ureal,可以定义在某个区间内可变的变量。 函数的调用格式为: p ureal(name,nominalvalue) % name为变量名,nominalValue为标称值,默认变化值为/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…...
Spring数据访问全解析:ORM整合与JDBC高效实践
目录 一、Spring ORM集成深度剖析 🌟 ORM模块架构设计 核心集成特性: 整合MyBatis示例配置: 二、Spring JDBC高效实践指南 🌟 传统JDBC vs Spring JDBC对比 🌟 JdbcTemplate核心操作示例 批量操作优化…...
【HCIA】使用Access port实现简易的VLAN间通信
前言 当我们拥有一台三层交换机与两个vlan,我们可以使用简易的Vlanif配置实现VLAN间通信。 文章目录 前言1. 拓扑图2. 配置交换机3. 配置PC1与PC2的网络4. port link-type后记修改记录 1. 拓扑图 2. 配置交换机 <Huawei>system-view [Huawei]undo info-cent…...
6.VTK 颜色
文章目录 概念RGB示例HSV示例 概念 RGB颜色系统:通过红(R)、绿(G)、蓝(B)三个颜色分量的组合来定义颜色。每个分量的取值范围是0到1,其中(0, 0, 0)代表黑色,而(1, 1, 1)代表白色。可以使用vtkProperty::SetColor(r, g, b)方法为Actor设置颜色…...
shiro使用
shiro是apache提供的一种安全框架。他可以将登录,权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…...
