MVVM Light学习笔记:Messenger 【转】

(一)Messenger的基本组成

Messenger类用于应用程序的通信,接受者只能接受注册的消息类型,另外目标类型可以被指定,用Send<TMessage, TTarget>(TMessage message)实现,在这种情况下信息只能被传递如果接受者类型和目标参数类型匹配,message可以是任何简单或者复杂的对象,你可以用特定的消息类型或者创建你自己的类型继承自他们

(1)MessageBase:简单的消息类,携带可选的信息关于消息发布者的

(2)GenericMessage<T>:范型消息

(3)NotificationMessage: 用于发送一个string类型通知给接受者

(4)NotificationMessage<T>:和上面一样是一个,且具有泛型功能。

(5)NotificationMessage:向接受者发送一个通知,允许接受者向发送者回传消息

(6)NotificationMessageAction<T>:NotificationMessage的泛型方式

(7)DialogMessage:发送者(通常是View)显示对话,并且传递调用者得回传结果(用于回调),接受者可以选择怎样显示对话框,可以使是标准的MessageBox也可也是自定义弹出窗口

(8)PropertyChangedMessage<T>:用于广播一个属性的改变在发送者里,和PropertyChanged事件有完全箱体内各的目的,但是是一种弱联系方式

(二)Messenger的案例演示。

下面用一个简单的列子讲解下Messenger的用法,在实例中,有两个窗口,一个是显示产品详细信息MainWindow.xaml,另一个是EditDetailView.xaml,通过选择MainWindow窗口中的任意产品,能在EditDetailView窗口显示,如果在EiditDetailView中修改产品的数量,可以将修改的结果立即呈现到MainWindow中。

原理浅析:发布者通过Messenger.Default.Send<T>发布某个类型消息,而接受者通过 Messenger.Default.Register<T>注册相应的消息类型,从而实现接受消息

主要代码如下:

发送者,代码片段

复制代码
 SelectedProductCommand =new RelayCommand(() =>
{
if (Products.CurrentItem !=null)
{
//获取当前选中列
Product selectedProduct = (Product)Products.CurrentItem;
//消息的发送
//(1)如果我们只需要接受者接受消息,用下面的方式就可以了
//发布消息 另一种写法Messenger.Default.Send<Product>(selectedProduct);
Messenger.Default.Send(selectedProduct);
//(2)如果我们需要接受者返回消息,还需要下面的代码
//发布消息,接受者可以通过NotificationMessageAction<Product> 的实例lastProduct的Excute()方法返回消息到接受者
Messenger.Default.Send(new NotificationMessageAction<Product>("当前选择的产品是:"+ selectedProduct.Description, FromEditViewModelCallBack));
}


}
);
复制代码

接受者,主要代码片段

复制代码
public EditDetailViewModel()
{
//消息的接受
//(1)如果我们只是接受消息,不返回消息,只需要下面的代码
Messenger.Default.Register<Product>(this, m => FromMainWindowProduct= m);
//(2)如果我们还需要向发送者返回消息,我们需要将如下代码,获取 NotificationMessageAction<Product> lastProduct实例
Messenger.Default.Register<NotificationMessageAction<Product>>
(
this, m =>
{
ShowMessage
= m.Notification;
lastProduct
= m;

}
);
SaveCommand
=new RelayCommand(() =>
{
//处理来至发送者的消息,并返回消息到发送者
lastProduct.Execute(product);
}
);
}
复制代码

源代码下载

 

Messenger是MVVMLight Toolkit提供的一个类。用来通信。

            Messenger.Default.Register<Customer>(this, "ChildWindow", AddCustomer);

要使用Messenger来传递消息,首先要注册一个消息。有一个标识Token用来区别标记不同的消息,如上段代码中“ChildWindow”。this表示接收器。<Customer>是消息的类型(一会儿我们传给AddCustomer的参数类型)。

我们的消息可以是任何类型,当然也可以是集合类型也可以是简单的boolean型

Messenger.Default.Register
复制代码
//
        // 摘要:注册一个消息接收器,当消息发送,接收到后就执行Action
        // 参数:
        //   recipient:
        //     消息接收器.
        //
        //   token:
        //     就像一个频道,        
        //     recipient注册的token和sender发送的Token一样时,消息被接受
        //   action:
        //     消息发送后会执行的操作.
        //
        // 类型参数:
        //   TMessage:
        //     发送的消息、会被执行的操作参数的类型.
        public virtual void Register<TMessage>(object recipient, object token, Action<TMessage> action);
复制代码

 


我们通过View中的一个OKButton来绑定一个Command OKButtonCommand 来发送这个消息。意思是妈妈叫你来AddCustomer了。

复制代码
        public RelayCommand<Customer> OKButtonCommand { get; private set; }
        private void OKButtonClick(Customer param)
        {
            /*
             * 发送一个 Customer 信息
             * Token 为 ChildWindow 只有具有相同 Token 接收者都会接收到该信息
             */
            // 注册一个接收者 Token 为 ChildWindow
            Messenger.Default.Send<Customer>(param, "ChildWindow");
        }
复制代码

我们还要定义一个AddCustomer方法来让this接收到消息以后去执行。

AddCustomer

不要忘了在CleanUp里把消息注销掉。不然会有可能下次妈妈叫AddCustomer的时候多加。注销请用

            Messenger.Default.Unregister<Customer>(this, "ChildWindow", AddCustomer);
posted @ 2012-08-02 12:07  JunBird  阅读(2104)  评论(0编辑  收藏  举报