MVVMLight-Mensenger 

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

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

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

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

1、事件方法

//子窗体
public event Action<int> FlashEventHandler;//声明事件
//保存命令
private void SaveEmployeeData()
{
FlashEventHandler();
} //父窗体
//注册事件,打开窗体
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>("", "token");

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

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

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

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

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

MVVMLight-Mensenger 学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. facebook 分享

    在 Android 平台分享 本指南详细介绍如何通过 Android 应用将内容分享到 Facebook.用户通过您的应用分享时,相关内容会在其时间线上显示,并且可能在其好友的动态消息中显示. 用户还 ...

  2. 【Git】GitHub for Windows使用(2) 分支

    目录 1.回看客户端相关功能 2.新建一个分支 3.在新分支上修改文件 4.上传新建分支上的修改,并合并分支 5.删除分支 1.回看客户端相关功能 看看设置中的以下内容 2.新建一个分支 3.在新分支 ...

  3. WebServic dynamic url

    How to make your Web Reference proxy URL dynamic 开发环境和部署环境,Webservice 的URL不同 需将url 配置到 web.config文件中 ...

  4. EF4.4 升级EF6.0问题总结

    如出现下面代码错误,基本可能确定EF数据库配置错误 在 System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeReso ...

  5. WebLogic Server的密码复杂性规则设置

    WebLogic Server默认的密码复杂性规则是长度为8位以上,必须包含数字和字母,但对于很多企业的安全而言是不足够的,因此WebLogic Server在Security模块中提供了Passwo ...

  6. [转载]CodeGear RAD 2007 SP4 最新下载及破解

    CodeGear RAD 2007 SP4 最新下载及破解  SN: 3AKS-S46LXF-5W7LSF-52CN SN: H4DP-YUSNW7-3MB4TK-2BLD (用这个安装才有源码) C ...

  7. linux 关闭端口

    第一步查看那些程序在使用该端口 netstat -anp或者netstat -tulnp 第二步杀死进程 kill -9 xxx,杀死某个进程 killall 进程名

  8. 深入理解Hadoop集群和网络【转】

    http://os.51cto.com/art/201211/364374.htm 本文将着重于讨论Hadoop集群的体系结构和方法,及它如何与网络和服务器基础设施的关系.最开始我们先学习一下Hado ...

  9. volatile型变量自增操作的隐患

      用FindBugs跑自己的项目,报出两处An increment to a volatile field isn't atomic.对应报错的代码例如以下: volatile int num = ...

  10. represent states with objects

    1. The behavior of objects in the real world is more complex than simply being in one state at a tim ...