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 交互时,能显著提升架构清晰度。