一、前言

      在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况:

       若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候,我们该怎么做?

       或者当一个.cs不方便在另一个.cs文件中new出来使用,但是我确实想传递消息给那个.cs,该怎么办?

       今天就说说MVVM Light中的Messager类,它继承自IMessager接口。

 

二、使用方法

      发送页面中:

Messenger.Default.Send<TMessage>(TMessage message); //第一种方法

Messenger.Default.Send<TMessage>(TMessage message, object token);//第二种方法

Messenger.Default.Send<TMessage, TTarget>(TMessage message);//第三种方法

      一般来说用第一种就足已:(里面的T可以是各种类型)

      我这里this是传的页面本身,可以自己决定传当前页面的特有部分: this.your_property 或者 this.your_method等等

 Messenger.Default.Send<GenericMessage<T>>(new GenericMessage<T>(this, value));

 

        接收页面中:

Messenger.Default.Register<GenericMessage<T>>(this, Your_Action);

private void Your_Action(GenericMessage<T> msg)
{
     // do with msg
}

       msg会包含发送页面的value,这样我就可以对msg进行相关的处理。

 

三、各种情况

      一个发送页面,一个页面接收时: 即第二部分的例子

       一个发送页面,多个页面接收时: 在各自的接收页面中需要对msg进行过滤,获取该接收页面需要的消息。

       多个发送页面,多个页面接收时: 每个发送页面可以设定T,即消息的类型,只要接收页面在Register的时候用对应的类型即可接收到自己想要的Send页面。

 

四、总结

      在MVVM中其实还是少用这些Messager类,它会使代码显得不具有可读性,又使程序的代码布局显得不清晰。因为你在一个页面中使用Messager.Default.Send时,其他人看你代码是不方便找到在哪里Register的。它不像我们平时两个页面只要引用一下就可以F12快速的跟踪过去。只有在你实在没办法的时候再去考虑Messager类。

posted on 2016-11-12 17:33  airforce094  阅读(1216)  评论(0编辑  收藏  举报