ObservableRecipient
ObservableRecipient
类型是可观察对象的基类,这些对象还充当消息收件人。 此类是 ObservableObject
的扩展,它还对使用 IMessenger
类型提供内置支持。
平台 API:
ObservableRecipient
、ObservableObject
、IMessenger
、WeakReferenceMessenger
、IRecipient<TMessage>
、PropertyChangedMessage<T>
工作原理
ObservableRecipient
类型旨在用作视图模型的基础,这些模型还使用 IMessenger
功能,因为它对其提供内置支持。 具体而言:
- 它有一个无参数构造函数和一个采用
IMessenger
实例的构造函数,用于依赖关系注入。 它还公开一个Messenger
属性,该属性可用于在视图模型中发送和接收消息。 如果使用无参数构造函数,WeakReferenceMessenger.Default
实例将分配给Messenger
属性。 - 它公开
IsActive
属性来激活/停用视图模型。 在此上下文中,“激活”意味着给定视图模型被标记为正在使用中,这样它将开始侦听已注册的消息、执行其他设置操作等。属性更改值时,调用了两个相关方法 -OnActivated
和OnDeactivated
。 默认情况下,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
}
}