ObservableRecipient

ObservableRecipient 类型是可观察对象的基类,这些对象还充当消息收件人。 此类是 ObservableObject 的扩展,它还对使用 IMessenger 类型提供内置支持。

平台 API:ObservableRecipientObservableObjectIMessengerWeakReferenceMessengerIRecipient<TMessage>PropertyChangedMessage<T>

工作原理

ObservableRecipient 类型旨在用作视图模型的基础,这些模型还使用 IMessenger 功能,因为它对其提供内置支持。 具体而言:

  • 它有一个无参数构造函数和一个采用 IMessenger 实例的构造函数,用于依赖关系注入。 它还公开一个 Messenger 属性,该属性可用于在视图模型中发送和接收消息。 如果使用无参数构造函数,WeakReferenceMessenger.Default 实例将分配给 Messenger 属性。
  • 它公开 IsActive 属性来激活/停用视图模型。 在此上下文中,“激活”意味着给定视图模型被标记为正在使用中,这样它将开始侦听已注册的消息、执行其他设置操作等。属性更改值时,调用了两个相关方法 - OnActivatedOnDeactivated。 默认情况下,OnDeactivated 会自动从所有已注册的消息中注销当前实例。 为了获得最佳结果并避免内存泄漏,建议使用 OnActivated 注册到消息,并使用 OnDeactivated 执行清理操作。 此模式支持多次启用/禁用视图模型,同时在每次停用时可以安全地收集,没有内存泄漏的风险。 默认情况下,OnActivated 会自动注册通过 IRecipient<TMessage> 接口定义的所有消息处理程序。
  • 它公开一个 Broadcast<T>(T, T, string) 方法,该方法通过 Messenger 属性提供的 IMessenger 实例发送 PropertyChangedMessage<T> 消息。 这可用于轻松广播视图模型属性中的更改,而无需手动检索要使用的 Messenger 实例。 此方法由各种 SetProperty 方法的重载使用,这些方法具有额外的 bool broadcast 属性来指示是否也发送消息。

下面是在激活后接收 LoggedInUserRequestMessage 消息的视图模型示例:

public class MyViewModel : ObservableRecipient, IRecipient<LoggedInUserRequestMessage>
{
    public void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

在上面的示例中,OnActivated 使用该方法作为要调用的操作,自动将实例注册为 LoggedInUserRequestMessage 消息的接收方。 并非必须使用 IRecipient<TMessage> 接口,也可手动完成注册(即使只使用内联 Lambda 表达式):

public class MyViewModel : ObservableRecipient
{
    protected override void OnActivated()
    {
        // Using a method group...
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) => r.Receive(m));

        // ...or a lambda expression
        Messenger.Register<MyViewModel, LoggedInUserRequestMessage>(this, (r, m) =>
        {
            // Handle the message here
        });
    }

    private void Receive(LoggedInUserRequestMessage message)
    {
        // Handle the message here
    }
}

示例

  • 查看示例应用(适用于多个 UI 框架),以了解 MVVM 工具包的实际运行情况。
  • 还可以在单元测试中查找更多示例。