MVVMLight-Mensenger 学习笔记
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 学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
随机推荐
- SQL SERVER 常用命令
红色为常用 0.row_number() over 和数据组合sale/cnt select *,row_number() over(order by productname) as rownumbe ...
- Step by Step 使用HTML5开发一个星际大战游戏(1)
本系列博文翻译自以下文章 http://blog.sklambert.com/html5-canvas-game-panning-a-background/ Languages: HTML5, Jav ...
- CMD_命令行
一.bat执行一闪而过 最后一个end下一行,加PAUSE 二.cmd命令:不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 需将路径先切换到system32下 cd c:\WINDO ...
- Kubernetes环境下调整WebLogic JVM基本参数
基于Kubernetes启动WebLogic后,发现JVM的最大heap size一直在700多M左右,通过 kubectl logs 察看pod启动状态,发现日志中并没有-Xms和-Xmx参数.日志 ...
- 10个常用的ps命令总结,参数
Linux系统中10个常用的ps命令总结 PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系统在某一事件的进程状态.如果你想不断更新查看的这个状态,可以使用 ...
- SQLSERVER调用DLL程序
在SQL Server中调用dll分为两个步骤 1.创建一个dll文件(dll文件分成3种类型,讲其中一种) 2.把dll文件放进SQL Server的程序集中.然后定义一个Function,就可以通 ...
- VS2010中使用命令行參数
在Linux下编程习惯了使用命令行參数,故使用VS2010时也尝试了一下. 新建项目,c++编敲代码例如以下: #include<iostream> #include<fstream ...
- golang中的那些坑之迭代器中的指针使用
今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之 示例代码: package main import "fmt" type ...
- LINUX 和WINDOWS下的自动登录小脚本
每天上班第一件事,就是连接公司LAB里面的机器,但首先要过一个防火墙,每次输用户名密码是很累人的事, 以下是两个脚本,可以放在启动项中,开机便自动登录 WINDOWS: @echo off ipcon ...
- 基础普及-Jar、War、Ear
名词解释 Jar文件(扩展名为. Jar) 包括Java类的普通库.资源(resources).辅助文件 (auxiliary files)等 War文件(扩展名为.War) 包括所有Web应用程序. ...