一、前言
在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类。