WPF CommunityToolkit.Mvvm 中的 ObservableRecipient

是什么?

ObservableRecipient 是 .NET Community Toolkit MVVM 库中的一个核心类,继承自 ObservableObject。它专为 WPF 应用设计,提供以下核心功能:

  • 基础数据绑定支持:通过 INotifyPropertyChanged 实现属性变更通知。
  • 消息传递机制:内置 IMessenger 接口实现,允许 ViewModel 之间松耦合通信。
  • 激活状态管理:提供 IsActive 属性,用于控制 ViewModel 的生命周期(如页面导航时自动激活/停用)。
怎么用?
1. 基本实现
public class MyViewModel : ObservableRecipient
{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value); // 继承自 ObservableObject}public MyViewModel(IMessenger messenger) : base(messenger)  // 依赖注入 IMessenger{// 注册消息监听Messenger.Register<DataUpdatedMessage>(this, (r, m) => {// 处理消息逻辑});}protected override void OnActivated(){// ViewModel 激活时执行(如页面加载)}
}

2. 发送消息
// 在其他 ViewModel 中发送消息
Messenger.Send(new DataUpdatedMessage("New Data"));

3. XAML 绑定
<TextBlock Text="{Binding Name}" />

优势
  1. 解耦通信

    • 通过消息机制替代直接引用,ViewModel 无需相互知晓。
    • 例如:页面 A 的 ViewModel 发送消息,页面 B 的 ViewModel 自动响应。
  2. 生命周期管理

    • 自动处理 OnActivated/OnDeactivated,避免资源泄漏。
    • 适合导航场景:离开页面时自动停用相关逻辑。
  3. 代码简洁性

    • 继承即用,无需重复实现 INotifyPropertyChanged
    • 消息注册/发送内置简化,对比传统事件减少 50% 样板代码。
  4. 可测试性

    • 消息机制允许单元测试中模拟通信。
    • 依赖注入 IMessenger 便于 Mock 测试。
典型应用场景
  • 跨页面数据同步(如:设置修改后全局更新)
  • 复杂工作流的组件协作
  • 需要响应式生命周期的模块(如实时数据订阅)

最佳实践
在大型 WPF 项目中优先使用 ObservableRecipient 而非直接继承 ObservableObject,尤其当涉及多 ViewModel 交互时,能显著提升架构清晰度。

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

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

相关文章

《C++》命名空间简述

文章目录 一、命名空间定义二、访问命名空间内的成员三、标准命名空间:std四、嵌套命名空间 一、命名空间定义 在C中&#xff0c;命名空间&#xff08;namespace)是一种将标识符分组的机制&#xff0c;用于避免重命名。例如&#xff1a; int a 3;int main() {int a 0;print…

【路径规划】基于Matlab的改进RRT算法二维/三维路径规划

基于Matlab的改进RRT算法二维/三维路径规划 一、引言 在机器人学、自动驾驶等领域&#xff0c;路径规划是一个关键问题&#xff0c;它旨在为机器人或车辆找到一条从起始点到目标点的安全、高效的路径。RRT&#xff08;Rapidly-exploring Random Trees&#xff09;算法作为一种…

PHP的命名空间与自动加载机制

在PHP 5.3版本之后&#xff0c;引入了命名空间的概念&#xff0c;这为解决全局命名冲突和促进代码的模块化提供了强有力的工具。命名空间允许开发者将类、函数和常量封装在不同的命名空间中&#xff0c;从而避免了全局范围内的名称冲突问题。 命名空间基础 命名空间在PHP中是…

OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构

使用场景使用步骤 引入模块组装&发送数据消费数据故障转移 使用场景 异步日志处理&#xff1a;将 OpenSIPS 中的 SIP 信令日志、通话记录&#xff08;CDR&#xff09;等数据发送到 Kafka 队列中。 事件通知与监控&#xff1a;利用 OpenSIPS 的 event_interface 模块将 S…

《AI大模型应用技术开发工程师》学习总结

以下是对你提供的《AI大模型应用技术开发工程师》课程内容的系统梳理&#xff0c;已去除所有广告、价格、报名、个人信息等内容&#xff0c;并补全了技术要点&#xff0c;最后给出客观的学习建议和个人感想&#xff0c;适合公开分享或自我学习参考。 AI大模型应用技术开发工程师…

Python爬虫实战:研究LOSO相关技术

1. 引言 1.1 研究背景与意义 随着互联网数据的爆炸式增长,个性化推荐系统成为提升用户体验的关键技术。准确捕捉用户兴趣需要大量多维度数据,但获取高质量标注数据面临隐私保护、数据分散等挑战。网络爬虫技术为自动采集用户行为数据提供了解决方案,而如何有效评估模型在个…

stm32万年历仿真+keil5程序

stm32万年历 本设计是利用单片机实现一个简易万年历系统&#xff0c;能够准确显示时、分、秒信息。用户可通过特定按键对时间进行设置调整&#xff0c;具备基本的时间校准功能&#xff0c;可满足日常简易计时需求。运用了stm32单片机模块内部定时器 / 计数器功能来实现精确计时…

操作系统--名称解释

第一章: 操作系统:位于硬件层之上,所有软件层之下的一个系统软件,是管理系统中各种软硬件资源,方便用户使用计算机系统的程序集合 并发:宏观上是同时发生,但是再微观是交替发生的(若干事件在同一时间间隔内发生,单CPU) 并行:微观上同时发生(要求多个CPU) 共享:系统的资源可以…

2025.6.16-实习

2025.6.18--2025.6.23 1.使用Cocos&#xff0c;从0开发老虎棒子鸡2D游戏。实现&#xff1a;AI自动选择&#xff0c;倒计时&#xff0c;对战逻辑&#xff0c;播放动画&#xff0c;设置背景音乐等功能。 2.使用Cocos&#xff0c;开发2D手术游戏。实现&#xff1a;视频、音频控制播…

构建你的 AI 模块宇宙:Spring AI MCP Server 深度定制指南

引言&#xff1a;当模块化遇见 AI 在微服务架构的海洋中&#xff0c;MCP&#xff08;Module Communication Protocol&#xff09;就像一艘智能帆船&#xff0c;它让不同 AI 模块的通信变得优雅而高效。本文将带你构建一艘属于自己的 AI 智能帆船——自定义 Spring AI MCP Serv…

从数据到洞察:UI前端如何利用大数据优化用户体验

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代&#xff0c;数据如同蕴藏着无限价值的宝藏&#xff0c;源源不断地产生并积累…

SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案

SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案 在嵌入式系统中存储大型媒体文件需要平衡存储效率、访问速度和资源限制。以下是针对嵌入式C环境的优化方案&#xff1a; 一、存储策略选择 1. 直接存储 vs 文件路径存储 方法优点缺点适用场景BLOB直接存储数据一致性高…

区块链技术概述:从比特币到Web3.0

目录 区块链技术概述&#xff1a;从比特币到Web3.0引言&#xff1a;数字革命的下一篇章1. 区块链技术基础1.1 区块链定义与核心特征1.2 区块链数据结构可视化 2. 比特币&#xff1a;区块链的开端2.1 比特币的核心创新2.2 比特币交易生命周期 3. 以太坊与智能合约革命3.1 以太坊…

Petrel导入well数据

加载井口位置数据&#xff1a;井头文件应包括name, X, Y, KB, TD这些基本信息&#xff0c;文件格式为txt或prn格式都可。具体步骤&#xff1a;① input面板下右键import file&#xff0c;进入import file界面&#xff0c;选择文件格式well heads&#xff08;*.*&#xff09…

51c嵌入式~电路~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12175265 一、高频电路布线的十大绝招 1 多层板布线 高频电路往往集成度较高&#xff0c;布线密度大&#xff0c;采用多层板既是布线所必须&#xff0c;也是降低干扰的有效手段。在PCB Layout阶段&#xff0c;合理的…

【LLM学习笔记3】搭建基于chatgpt的问答系统(下)

目录 一、检查结果检查有害内容检查是否符合产品信息 二、搭建一个简单的问答系统三、评估输出1.当存在一个简单的正确答案2.当不存在一个简单的正确答案 一、检查结果 本章将引领你了解如何评估系统生成的输出。在任何场景中&#xff0c;无论是自动化流程还是其他环境&#x…

多项目资料如何统一归档与权限管理

在多项目管理环境中&#xff0c;统一资料归档与权限管控的关键在于&#xff1a;规范化文件结构、自动化归档流程、分级权限控制。其中&#xff0c;规范化文件结构是实现统一归档的第一步&#xff0c;它直接决定后续归类、检索和审计的效率。通过预设项目模板&#xff0c;明确文…

【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 1:不含扩展

目前打包、解包没有对扩展进行操作 测试结果 === H.264 RTP Packetization and Depacketization Test ===1. Generating simulated H.264 frames... Generated 6 H.264 frames2. Packetizing H.264 frames to RTP packets...Frame #0 (size: 1535 bytes, I-fra

【AI论文】Sekai:面向世界探索的视频数据集

摘要&#xff1a;视频生成技术已经取得了显著进展&#xff0c;有望成为交互式世界探索的基础。然而&#xff0c;现有的视频生成数据集并不适合用于世界探索训练&#xff0c;因为它们存在一些局限性&#xff1a;地理位置有限、视频时长短、场景静态&#xff0c;以及缺乏关于探索…

websocket服务端开发

websocket技术在服务端实时消息的推送和im聊天系统中得到了广泛应用。作为一名后端研发人员,这其中又有哪些需要了解和注意的问题点呢?接下来,我一一进行阐明。 SpringBoot项目中引入依赖 引入依赖 <!--websocket支持包--> <dependency> <…