转自:
https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/june/mvvm-the-mvvm-light-messenger-in-depth
http://dotnetpattern.com/mvvm-light-messenger
用于在应用程序内进行通信的 Messenger 类(和各种消息类型)。收件人仅收到他们注册的消息类型。此外,可以指定目标类型,在这种情况下,只有在收件人的类型与目标参数匹配时才会传输消息。
创建 MVVM Light Messenger 的目的是通过一个简单的前提简化此场景:任何对象都可以是接收器;任何对象都可以是发送者;任何对象都可以是消息。
想使用这个功能,需要在引用里加上头文件 using GalaSoft.MvvmLight.Messaging;和GalaSoft.MvvmLight.WPF4.dll 这个库;
具体: public virtual void Send(TMessage message); 其中 TMessage 是应用程序中视图/页面的 Uri 字符串。
Messenger 类重要属性和方法
1:Default (static) : IMessenger
提供 Messenger 的默认实例,允许以静态方式注册和发送消息。
2:Reset (static) : void
删除 Messenger 的默认实例。当您再次使用 Messenger 的 Default 属性时,它会创建新的 Messenger 类。
3:Register(object receiver, object token, bool receiveDerivedMessagesToo, Action action) : void
此方法 为一种消息 TMessage 注册接收者。TMessage 可以是 int、string 或自定义类之类的任何内容。MVVM Light 工具包还提供了一些可用于发送消息的类,如 NotificationMessage、PropertyChangedMessage 等
所有四个参数的用法是:
对象接收者: 将接收消息的对象。您可以使用“this”来注册当前对象以接收消息,也可以指定其他对象。
object token : Token 是一个关键字,用于将消息发送给使用该特定关键字注册的那些对象。例如,如果两个接收者使用“ViewModelA”令牌和“ViewModelB”令牌注册并且使用“ViewModelA”令牌发送消息,则只有该对象获得使用“ViewModelA”令牌注册的消息。
bool receiveDerivedMessagesToo: 如果我们将此标志设置为“true”,则接收者还将获得从 <TMessage> 继承的消息类型。例如,如果自行车和汽车都实现了 IAutomobile 接口,则使用 <IAutomobile> 类型注册并将 receiveDerivedMessagesToo 标志设置为 true,允许接收者也获得自行车和汽车消息。
Action<TMessage> action: 当从 Send 消息发送 <TMessage> 的消息时,将执行动作委托。
4:Unregister(object receiver, object token, Action action): void
此方法取消注册一种消息 TMessage 的接收者。
5:Send(TMessage message, object token) : void
此方法将消息发送给注册的收件人。只有那些收件人会收到为该特定 注册的消息。
所有两个参数的用法是:
6:TMessage 消息:Message 参数是 TMessage 类型的实例。
对象令牌:如前所述,令牌是一个关键字,用于仅将消息发送给注册该特定关键字的那些收件人。
Cleanup : void
此方法扫描已死收件人的收件人列表。所有接收者都存储为 WeakReferences ,它们可以在垃圾收集过程中被声明。清理方法删除垃圾收集器收集的那些收件人。
注册消息类型 (RegistrationInfo) 是通过委托 (HandleRegistrationInfo) 完成的:
public class Registrati
{
public void SendUpdate()
{
var info = new RegistrationInfo
{
// ... Some properties
};
Messenger.Default.Send(info);
}
}
public class RegisteredUser
{
public RegisteredUser()
{
Messenger.Default.Register<RegistrationInfo>(
this,
HandleRegistrationInfo);
}
private void HandleRegistrationInfo(RegistrationInfo info)
{
// Update registered user info
}
}
public class RegistrationInfo
{
// ... Some properties
}
跨线程访问:
public void RunOnBackgroundThread()
{
// Do some background operation
DispatcherHelper.CheckBeginInvokeOnUI(
() =>
{
Messenger.Default.Send(new ConfirmationMessage());
});
}