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}" />
优势
-
解耦通信
- 通过消息机制替代直接引用,ViewModel 无需相互知晓。
- 例如:页面 A 的 ViewModel 发送消息,页面 B 的 ViewModel 自动响应。
-
生命周期管理
- 自动处理
OnActivated
/OnDeactivated
,避免资源泄漏。 - 适合导航场景:离开页面时自动停用相关逻辑。
- 自动处理
-
代码简洁性
- 继承即用,无需重复实现
INotifyPropertyChanged
。 - 消息注册/发送内置简化,对比传统事件减少 50% 样板代码。
- 继承即用,无需重复实现
-
可测试性
- 消息机制允许单元测试中模拟通信。
- 依赖注入
IMessenger
便于 Mock 测试。
典型应用场景
- 跨页面数据同步(如:设置修改后全局更新)
- 复杂工作流的组件协作
- 需要响应式生命周期的模块(如实时数据订阅)
最佳实践:
在大型 WPF 项目中优先使用ObservableRecipient
而非直接继承ObservableObject
,尤其当涉及多 ViewModel 交互时,能显著提升架构清晰度。