本文详细解释如何使用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<类型>的泛型版本.