MVVMLight-Mensenger 学习笔记

MVVMLight-Mensenger 

最近一直在使用WPF,配合美工很容易能搭配出效果不错的UI来,开发效率也明显加快

自己也是最近才开始使用Mvvmlight,通过view和viewmodel分离的模式来进行开发,不但避免了频繁操作各种控件属性事件的麻烦,而且直接操作数据源更加直观。(吐槽:每个界面手工创建VM,有点费劲,界面太多了找vm有点麻烦)

Mvvmlight中Mensender类是它的一个特色,通过注册发送Messenger能过使不同界面通讯。

在此之前,我往往是通过事件或者属性传递来做父子窗体的数据传输,大致如下:

1、事件方法

//子窗体
public event Action<int> FlashEventHandler;//声明事件
//保存命令
private void SaveEmployeeData()
{
     FlashEventHandler(1);
}

//父窗体
//注册事件,打开窗体
Con_EmpInfoManger_EmpInfo_Edit con_Emp = new Con_EmpInfoManger_EmpInfo_Edit();
con_Emp.FlashEventHandler+=new Action(con_Emp_FlashEventHandler);
con_Emp.ShowDialog();
//执行刷新
void con_Emp_FlashEventHandler()
{
      QueryGrid.ReFresh();
}
View Code
2.传主窗体对象
//主窗体
Con_EmpInfoManger_EmpInfo_Edit con_Emp = new Con_EmpInfoManger_EmpInfo_Edit(this);
            con_Emp.FlashEventHandler+=new Action(con_Emp_FlashEventHandler);
            con_Emp.ShowDialog();

//子窗体
private Con_EmpInfo objFrm = null;
public Con_EmpInfoManger_EmpInfo_Edit(Con_EmpInfo frm)
{
     objFrm =frm;
}
private void SaveEmployeeData()
{
    objFrm .回调公共方法();
}
View Code

当然实现这种简单需求的方法很多,这里我要介绍的是MVVMLight中Messenger方法

Messenger方法主要提供了Register<TMessage>,UnRegister<TMessage>,Send<TMessage>三个方法来实现消息的注册,注销和发送.并且支持任意类型的数据传输.那简单的实现就如下:

//父窗体
Messenger.Default.Register<string>(this, "token", e =>
{
        MessageBox(e);//显示接收到的信息
}

//子窗体
//发送命令
 Messenger.Default.Send<string>("0", "token");
View Code

你看很简单得发送接收,跟是哪个界面调用的完全没有关系,相当于说耦合性相当低.那它是怎么实现的呢?

实际上MvvmLight中加入了Messenger这么一个静态的对象,与其说是静态它其实是一个单例,系统中各个界面获得这个对象来操作它维系的一个事件列表.

这个事件列表Dictionary<Type, List<ActionAndToken>> 很明显包含了Type以及一个事件和标记的列表.通过Register(增加),UnRegister(删除)和Send(调用)来实现消息功能,并且它不是一个强引用,所以再增减一个对象不会导致内存泄露.其中的原理也很简单,交叉比对列表来调用Action.具体内容大家可以看下源码.

值得注意的一点,要防止消息的重复注册以及何时应该注销注册.这个在实际操作当中可能会遇到,但是很容易能够解决.

我的第一篇技术博,大家轻拍,本人初学乍练有问题请大侠们指出,谢谢!!!

posted @ 2013-11-30 11:28  钱耀祖  阅读(875)  评论(1编辑  收藏  举报