MVVM Light Messenger类

转自:
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());
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值