WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)

发布于:2025-06-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到