MVVM Light Messenger的使用

本文详细解释如何使用Messenger让ViewModel和Model进行通信.

(1)为了使消息更便于维护需要定义一个消息类

public class Notifications
{
     public static readonly string CusMessage= Guid.NewGuid().ToString();
     //可以在下面添加自己以后还要用到的消息
}

(2)在 ViewModel中发送消息

    NotificationMessage msg = new NotificationMessage(Notifications.CusMessage);
    Messenger.Default.Send<NotificationMessage>(msg);

(3)分别在View窗口的OnNavigatedTo和OnNavigatedFrom对消息进行注册

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
 {
            base.OnNavigatedTo(e);
            Messenger.Default.Register<NotificationMessage>(this, (msg)=>
                               {
                                   if(msg.Notification==Notifications.CusMessage)
                                  {
                                       //当消息发生时执行的逻辑
                                  }
                               }
                           );
 }

(4)现在已经满足了基本功能,另外Mvvm Light还提供一个给力的功能,可以向View中传送一个方法,类似于回调.

    这需要用到 DialogMessage和 NotificationMessageAction

具体使用方法,

   测试代码如下.

  DialogMessage msg = new DialogMessage("提示正文", MessageBoxCallBack);
  //设置弹出的MessageBox的类型,包含两个按钮,一个"确认", 一个"取消"
  msg.Button = MessageBoxButton.OKCancel;
  msg.Caption="标题";
  Messenger.Default.Send<DialogMessage>(msg);
  //提示框的回调
  private void MessageBoxCallBack(MessageBoxResult ret)
  {
        if (ret == MessageBoxResult.OK)
        {

        }
  }                                                                                                                                                       

 在View中添加如下代码:

Messenger.Default.Register<DialogMessage>(this, dlgmsg =>
     {
        var res= MessageBox.Show(dlgmsg.Content, dlgmsg.Caption, dlgmsg.Button);
        dlgmsg.Callback(res);  //这句会此起ViewModel中的MessageBoxCallBack调用 
      }
看到没有,DialogMessage包含了弹出框需要的全部信息,包括标题,正文和回调函数.在这个Demo中需要注意一下MessageBox是模态的,因此当执行到MessageBox.Show()时,执行流会卡住,等到用户点击"OK"惑"Cancel"按钮后,程序才会继续执行.程序中会用到自定义的弹出框.Coding4Fun的弹出框还有自定义的弹出框都不是模态的,这时我们可以把msg当作参数传到自定义的弹出框中,然后:  dlgmsg.Callback(res);  //这句会此起ViewModel中的MessageBoxCallBack调用 下面来说一下NotificationMessageAction  
NotificationMessageAction<MessageBoxResult> msg = new NotificationMessageAction<MessageBoxResult>("测试", (ret) =>
       {
               if (ret == MessageBoxResult.OK)
               {


                }
       }
   );
   Messenger.Default.Send<NotificationMessageAction<MessageBoxResult>>(msg);
在View是里面:
Messenger.Default.Register<NotificationMessageAction<MessageBoxResult>>(this, (msg) =>
                {
                    var ret = MessageBox.Show("d", "d", MessageBoxButton.OKCancel);
                    
                    if (msg.Notification!=null)
                    {
			 msg.Execute(ret);
                    }
                }
    );


如果ViewModel需要向View发送一个对象,可以使用 NotificationMessage<类型>的泛型版本.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值