一文读懂WPF系列之MVVM

WPF MVVM

  • 什么是MVVM
  • WPF为何使用MVVM机制
    • WPFMVVM 的实现手段
  • INotifyPropertyChanged
    • ​数据绑定的源端通知​​
    • 原理 PropertyChanged事件
    • 双向绑定的完整条件
    • 常见疑惑问题

什么是MVVM

翻译全称就是 model-view-viewmodel 3部分内容

  1. 以wpf的概念角度来解释就是 数据库数据源模型----xmal UI视图----DataContext​​ Viewmodel使用模型承载方式

  2. 以技术点的角度来解释就是通过 UI的依赖属性 - binding-ViewModel 数据之间 双向绑定
    UI控件内容变动可以作用于viewmodel,viewmodel模型内容变动也可以作用于UI控件内容显示

WPF为何使用MVVM机制

  1. 职责分离​​
    ​​View​​:仅负责 UI 呈现,通过 XAML 绑定依赖属性。
    ​​ViewModel​​:处理业务逻辑,通过 INotifyPropertyChanged 驱动数据流。
    ​​Model​​:封装数据结构和业务规则。
  2. ​​可测试性与维护性​​
    ViewModel 独立于 UI,便于单元测试。
    样式与逻辑解耦,支持设计师与开发者并行工作

WPFMVVM 的实现手段

在 WPF 中,​​依赖属性​​、​​数据绑定​​和 ​​INotifyPropertyChanged​​ 是支撑 MVVM(Model-View-ViewModel)设计模式的三大核心

  1. 依赖属性与 View 的绑定​​
    ​​自定义控件​​:通过依赖属性定义控件行为(如 NumericBox.Value),并绑定到 ViewModel 属性。
    ​​数据模板​​:在控件模板中使用 TemplateBinding 关联依赖属性与模板元素。
  2. ​​INotifyPropertyChanged 与 ViewModel 的绑定​​
    ​​数据驱动 UI​​:ViewModel 的 CLR 属性通过 INotifyPropertyChanged 实现双向绑定,例如用户输入实时同步到数据源。
    ​​工具辅助​​:使用 Fody 库的 [ImplementPropertyChanged] 特性自动生成属性变更代码,减少样板代码。
  3. ​​数据绑定引擎的协作​​
    ​​绑定模式​​:
    ​​单向绑定​​(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事件

  1. INotifyPropertyChanged 是一个接口,定义了一个 PropertyChanged 事件
  2. 当 ViewModel 中的属性值发生变化时,触发 PropertyChanged 事件,并传递属性名称。
  3. WPF 的绑定引擎会监听此事件,并根据属性名称更新对应的 UI 元素

双向绑定的完整条件

  1. 目标属性是依赖属性​​(如 TextBox.Text)。
  2. 源属性实现 INotifyPropertyChanged​​(ViewModel 属性)。
  3. ​​显式设置 Mode=TwoWay​​(除非依赖目标属性默认支持双向)。
  4. ​​更新触发时机​​:通过 UpdateSourceTrigger 控制同步时机(如 PropertyChanged 或 LostFocus)

常见疑惑问题

  1. 如果没有用到INotifyPropertyChanged,即使binding 设置了 twoway 也无法viewmodel变更后 作用UI显示
  2. 绑定不更新
    可能原因:
    未正确调用 OnPropertyChanged。
    属性名称拼写错误(使用 nameof 避免)。
    未启用 Mode=TwoWay(如需要从 View 更新到 ViewModel)
  3. 目前DataContext​​是通过=this的写法 来表现数据源的,无法使用mvvm 所以为什么推荐使用 viewmodel的写法来使用,DataContext = this 的适用场景​​:仅适用于原型验证或极小规模工具,不推荐生产环境使用
  4. 在 WPF 中,若绑定模式设置为 OneWay,且 ViewModel 实现了 INotifyPropertyChanged 接口,​​数据源的变更会触发 UI 更新​​,但 UI 的修改不会反向同步到数据源

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

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

相关文章

OCR API识别对比

OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…

嵌入式MCU常用模块

日后填坑。 无线通信模块 2.4G 基本介绍 以NRF24L01为例。 NRF24L01是一款2.4GHz的无线收发模块&#xff0c;支持SPI通信协议&#xff0c;具有低功耗、高数据速率&#xff08;250kbps-2Mbps&#xff09;和多设备通信能力。 它可以同时与最多6个其他模块通信&#xff0c;适合…

记一次InternVL3- 2B 8B的部署测验日志

测试效果&#xff1a; 问题和耗时如图 5、资源占用 不释放资源会一直涨显存。总体还算满意&#xff0c;我试了好多个图理解大模型&#xff0c;就属它牛一点 附图一张 补充&#xff0c;测试InternVL3-2B的结果 1、模型下载魔搭社区 2、运行环境&#xff1a; 1、硬件 RTX 30…

Java版本对应关系表

Java版本对应关系表 以下Java主要版本&#xff08;Major Version&#xff09;与公开大版本号的对应关系 公开大版本名称Major 版本号内部版本号格式示例&#xff08;java -version输出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安装教程(保姆级)

Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 yarn——计算资源统一…

android11 配置默认电池优化白名单

目录 1.介绍 2.读取配置文件 3.默认配置一个白名单列表 1.介绍 在 Android 11 中,DeviceIdleController 是负责控制设备进入 Doze 模式(闲置模式) 的核心系统服务,其内部方法 readConfigFileLocked() 负责从配置文件中读取 Doze 模式的行为参数,包括 idle 阶段的时间间…

java中的Future的设计模式 手写一个简易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一个蛋糕有点仪式感&#xff0c;于是去蛋糕店预定&#xff0c;预定完之后&#xff0c;店老板说蛋糕做好了&#xff0c;到时电话通知你&#xff0c;不可能在这傻傻的等着吧&#xff0c;还有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定义网络协议 1.1 为什么可以编写出一个自定义的Redis客户端 为什么我们可以编写出一个自定义的Redis客户端&#xff1f;因为Redis公开了自己的自定义协议。而对于一些其他软件的客户端&#xff0c;我们无法编写出一个自定义的Redis客户端&#xff0c;因为他们没…

【软考系统架构设计师】软件工程知识点

1、 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体分为问题定义、可行性研究、需求分析等 软件开发时期&#xff1a;软件的设计与实现&#xff0c;分为概要设计、详细设计、…

DeepSeek 与开源:肥沃土壤孕育 AI 硕果

当国产 AI DeepSeek 以其低成本推理和多模态能力在全球范围内引起轰动时&#xff0c;人们惊叹于中国技术的迅猛发展&#xff0c;却很少有人深究这一成就背后的根基。答案其实早已写在中国开源生态二十多年的发展历程中。 从倪光南院士提出“以开源打破技术垄断”的理念&#x…

职坐标:智慧城市未来发展的核心驱动力

内容概要 智慧城市的演进正以颠覆性创新重构人类生存空间&#xff0c;其发展脉络由物联网、人工智能与云计算三大技术支柱交织而成。这些技术不仅推动城市治理从经验决策转向数据驱动模式&#xff0c;更通过实时感知与智能分析&#xff0c;实现交通、能源等领域的精准调控。以…

vue复习46~90

1.小兔鲜 所有都折叠 ctrl k,ctrl0 所有都展开 ctrl k,ctrlj当前结构渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped样式冲突 结构&#xff1a;只能有一个根元素样式&#xff1a;全局样式(默认)&#xff1…

PHP 用 workman 即时通讯,做个简版QQ

1. workman是什么 &#xff0c;一般应用在那些地方 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天室…

【WORD】批量将doc转为docx

具体步骤进行&#xff1a; 打开Word文档&#xff0c;按下AltF11快捷键&#xff0c;打开VBA编辑器。在VBA编辑器中&#xff0c;左侧的“项目资源管理器”窗口会显示当前打开的Word文档相关项目。找到您要添加代码的文档项目&#xff08;通常以文档名称命名&#xff09;&#xf…

【免费】【实测有用】5KPlayer Windows 电脑作为 MacBook 无线扩展屏

总结&#xff1a;使用 5KPlayer 将 Windows 电脑作为 MacBook 无线扩展屏 准备工作 设备要求&#xff1a; MacBook 和 Windows 电脑需连接到同一 Wi-Fi 网络。【这里有雷&#xff1a;eduroam不会成功&#xff0c;家里的WIFI成功了&#xff0c;需要确认校园网是否可行。】确保…

华为华三模拟器解决兼容问题Win11 24H2 现在使用ENSP的问题解决了

一、Win11 24H2 现在使用ENSP的问题解决了 这个Win11 的 24H2不能使用ENSP的问题已经困扰我们很久了,在之前的文章中,我们也有说明这个问题 之前ENSP肯定启动会报错40 当时还建议大家先不要更新到win11的24H2版本,现在终于迎来了更新,不用再担心了,包括早就升级了24H2版…

嵌入式WebRTC轻量化SDK压缩至500K-800K ,为嵌入式设备节省Flash资源

一、SDK轻量化的核心技术实现 1、WebRTC库裁剪与模块化设计 EasyRTC针对嵌入式设备的资源限制&#xff0c;对原生WebRTC库进行深度裁剪&#xff0c;仅保留核心通信功能&#xff08;如信令管理、编解码、网络传输等&#xff09;&#xff0c;移除冗余组件&#xff08;如部分调试…

Maya云渲染工作流,提升渲染速度

在三维动画与影视特效领域&#xff0c;Autodesk Maya作为行业标杆工具&#xff0c;承载着从角色建模到复杂特效渲染的全流程创作。然而&#xff0c;本地硬件性能不足、渲染周期漫长、跨团队协作效率低等痛点始终困扰着创作者。渲染101云渲染以弹性算力资源、智能化工作流与全方…

git怎么使远程分支回退到指定的节点处

git使远程分支回退到指定的节点 引言场景描述步骤 引言 最近提交代码的时候&#xff0c;总将分支合并错&#xff0c;原本要合到A分支&#xff0c;结果合并到了B分支&#xff0c;这样就导致b分支需要回退到我没有合并之前的节点处。 本文记录下怎么将远程分支回退到指定的节点。…

全网通emotn ui桌面免费吗?如何开机自启动

在智能设备的使用中&#xff0c;一款优秀的桌面系统能带来截然不同的体验。全网通Emotn UI桌面便是其中的佼佼者&#xff0c;它以完全免费的特性与卓越性能&#xff0c;成为众多用户的心头好。 其简洁美观的界面设计如同为设备换上"清新外衣"&#xff0c;常用功能一…