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(); }
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 .回调公共方法(); }
当然实现这种简单需求的方法很多,这里我要介绍的是MVVMLight中Messenger方法
Messenger方法主要提供了Register<TMessage>,UnRegister<TMessage>,Send<TMessage>三个方法来实现消息的注册,注销和发送.并且支持任意类型的数据传输.那简单的实现就如下:
//父窗体 Messenger.Default.Register<string>(this, "token", e => { MessageBox(e);//显示接收到的信息 } //子窗体 //发送命令 Messenger.Default.Send<string>("0", "token");
你看很简单得发送接收,跟是哪个界面调用的完全没有关系,相当于说耦合性相当低.那它是怎么实现的呢?
实际上MvvmLight中加入了Messenger这么一个静态的对象,与其说是静态它其实是一个单例,系统中各个界面获得这个对象来操作它维系的一个事件列表.
这个事件列表Dictionary<Type, List<ActionAndToken>> 很明显包含了Type以及一个事件和标记的列表.通过Register(增加),UnRegister(删除)和Send(调用)来实现消息功能,并且它不是一个强引用,所以再增减一个对象不会导致内存泄露.其中的原理也很简单,交叉比对列表来调用Action.具体内容大家可以看下源码.
值得注意的一点,要防止消息的重复注册以及何时应该注销注册.这个在实际操作当中可能会遇到,但是很容易能够解决.
我的第一篇技术博,大家轻拍,本人初学乍练有问题请大侠们指出,谢谢!!!