当前位置: 首页 > news >正文

ObservableRecipient与ObservableObject

在 MVVM(Model-View-ViewModel) 框架中,ObservableObject 和 ObservableRecipient 是 CommunityToolkit.Mvvm(原名 Microsoft.Toolkit.Mvvm)提供的两个基类,用于实现数据绑定和消息传递。以下是它们的核心区别与用法:


1. ObservableObject

作用
  • 基础实现 INotifyPropertyChanged,用于通知 UI 属性变更(数据绑定)。

  • 核心方法:SetPropertyOnPropertyChanged

典型用法
using CommunityToolkit.Mvvm.ComponentModel;public class UserViewModel : ObservableObject
{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value); // 自动触发 PropertyChanged}
}
特点
  • 轻量级:仅处理属性变更通知。

  • 手动触发:需要显式调用 SetProperty 或 OnPropertyChanged


2. `ObservableRecipient

作用
  • 继承自 ObservableObject额外支持消息传递IMessenger 模式)。

  • 核心功能:

    • 继承 ObservableObject 的所有能力。

    • 内置 IMessenger 支持(跨 ViewModel 通信)。

    • 提供 IsActive 模式(控制消息订阅的生命周期)。

典型用法
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;public class UserViewModel : ObservableRecipient
{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value);}protected override void OnActivated(){// 注册接收消息(当 ViewModel 激活时)Messenger.Register<UserUpdatedMessage>(this, (r, m) =>{Name = m.NewName;});}protected override void OnDeactivated(){// 清理消息注册(当 ViewModel 销毁时)Messenger.Unregister<UserUpdatedMessage>(this);}
}
特点
  • 消息传递:通过 IMessenger 实现松耦合通信(如跨页面的数据更新)。

  • 生命周期控制:通过 IsActive 管理消息订阅的激活/销毁。

  • 依赖 IMessenger:需在 DI 容器中注册 WeakReferenceMessenger.Default


3. 关键差异对比

特性ObservableObjectObservableRecipient
基类功能仅实现 INotifyPropertyChanged继承 ObservableObject,额外支持消息传递
消息机制不支持内置 IMessenger(WeakReference 模式)
生命周期控制通过 IsActive 管理消息订阅
适用场景简单数据绑定跨 ViewModel 通信或复杂状态管理

4. 如何选择?

使用 ObservableObject 当:
  • 只需要 属性变更通知(如绑定文本框到 string 属性)。

  • 不涉及跨组件通信。

使用 ObservableRecipient 当:
  • 需要 多个 ViewModel 之间通信(如发送“用户已登录”事件)。

  • 需要 自动管理消息订阅的生命周期(避免内存泄漏)。


5. 完整示例:消息传递场景

步骤 1:定义消息类型
public class UserLoggedInMessage
{public string Username { get; set; }
}
步骤 2:发送消息的 ViewModel
public class LoginViewModel : ObservableRecipient
{public void Login(string username){Messenger.Send(new UserLoggedInMessage { Username = username });}
}
步骤 3:接收消息的 ViewModel
public class DashboardViewModel : ObservableRecipient
{private string _welcomeMessage;public string WelcomeMessage{get => _welcomeMessage;set => SetProperty(ref _welcomeMessage, value);}protected override void OnActivated(){Messenger.Register<UserLoggedInMessage>(this, (r, m) =>{WelcomeMessage = $"Welcome, {m.Username}!";});}
}

6. 性能与注意事项

  • ObservableRecipient 更重:因包含消息系统,适合复杂场景。

  • 避免过度使用消息:简单数据流直接用属性绑定即可。

  • IsActive 的用途

    • 当 ViewModel 绑定到 UI 时(如页面加载),IsActive = true 激活消息订阅。

    • 当 UI 卸载时(如页面关闭),IsActive = false 自动清理订阅。


通过合理选择基类,可以平衡代码的简洁性和功能性。对于大多数 MVVM 应用,ObservableObject 足够;跨组件通信时再升级到 ObservableRecipient

相关文章:

  • 深度学习习题2
  • Python爬虫与Java爬虫深度对比:从原理到实战案例解析
  • Java 中比较两个 long 类型变量大小的方法
  • Linux网桥实战手册:从基础配置到虚拟化网络深度优化
  • N2语法 強調、限定
  • RK3588 InsightFace人脸识别移植及精度测试全解析
  • 合并表格(按行合并)
  • 汇川变频器MD600S-4T-5R5为什么要搭配GRJ9000S-10-T滤波器?
  • Unity基础-Mathf相关
  • latex画表格
  • 深度学习习题3
  • c# :this() 和 :base()区别
  • Axure 与 Cursor 集成实现方案
  • 【iOS】cache_t分析
  • IDEA202403 设置主题和护眼色
  • 探秘 MyBatis:开启你的数据库操作「智能之旅」
  • 如何设置合适的缓存过期时间(TTL)?是否有必要实现缓存预热?
  • 模型蒸馏过程中的“软目标”与“温度”
  • 中国森林地上和地下植被碳储量数据集(2002~2021)
  • glibc 交叉编译
  • 北京发展和城乡建设委员会网站/韩国热搜榜
  • 网站获取访客/关键词查询网站
  • 购物网站用html怎么做/腾讯nba新闻
  • 如何让人帮忙做网站/国内永久免费域名注册
  • 设计制作生态瓶教学反思/广州seo网站
  • 批发网站怎么做/web网页