看MVVMLight的Messager源码,自己实现了一个简单的Messager类。
Messager类可以在MVVM中,实现View与VM、VM与VM、View与View的通信。

  1. public class Messager
  2. {
  3. private static Messager _MessageInstance;
  4. private Dictionary<string,Action> _MessageCollection=new Dictionary<string,Action> ();
  5. private Dictionary<string, ActionClass> _MessageTCollection = new Dictionary<string, ActionClass>();
  6.  
  7. public static Messager Default
  8. {
  9. get
  10. {
  11. if (_MessageInstance == null)
  12. {
  13. _MessageInstance = new Messager();
  14. }
  15. return _MessageInstance;
  16. }
  17. }
  18.  
  19. public void Register(string key,Action action)
  20. {
  21. _MessageCollection.Add(key,action);
  22. }
  23.  
  24. public void Register<T>(string key, Action<T> action)
  25. {
  26. ActionClass<T> actionClass = new ActionClass<T>();
  27. actionClass.action = action;
  28. _MessageTCollection.Add(key, actionClass);
  29. }
  30.  
  31. public void Send(string key)
  32. {
  33. if (_MessageCollection.Keys.Contains(key))
  34. {
  35. _MessageCollection[key].Invoke();
  36. }
  37. }
  38.  
  39. public void Send<T>(string key,T para)
  40. {
  41. if (_MessageTCollection.Keys.Contains(key))
  42. {
  43. ActionClass<T> actionClass=(ActionClass<T>) _MessageTCollection[key];
  44. actionClass.action.Invoke(para);
  45. }
  46. }
  47.  
  48. }

主要通过Register方法来注册,Send方法来触发。

比如,VM中需要显示一个窗体,为了不破坏MVVM模式,我们可以把显示窗体的方法写在View中,并注册到Messager

  1. Messager.Default.Register<string>("ChangeControlShow", ExecuteChangedContrlShow);
  2. private void ExecuteChangedContrlShow(string msg)
  3. {
  4. //some code...
  5. }

在VM中调用

  1. Messager.Default.Send<string>("ChangeControlShow","test");

Send有两个参数,第一个是方法的Key,根据这个Key,可以找到唯一的方法,
第二个参数是需要调用的方法的参数。

这样,你只要知道方法的key,在任何文件中,都可以调用注册的方法,不需要我们再去使用委托了。

MVVM 简化的Messager类的更多相关文章

  1. 【MVVM Light】Messager的使用

    一.前言       在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况: 若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候 ...

  2. 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类

    经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...

  3. MyBatis sqlsession 简化 使用工具类创建

    2019-04-09 @Test public void Test() throws Exception { // 1.读取配置文件 String resource = "mybatis-c ...

  4. Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写

    转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...

  5. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  6. MVVM Light须要注意的10个问题

    MVVM Light须要注意的10个问题 从使用XAML技术基础開始(实际上并非非常久曾经).我便关注MVVM(Model – View – ViewModel)模式.偶然接触到MVVM Light不 ...

  7. mvc、mvp和mvvm

    一.MVC 设计图: 可能由于MVP.MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM.因为后两种都是基于MVC发展而来的. 1 ...

  8. Java+7入门经典 - 6 扩展类与继承 Part 2/2

    6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...

  9. Leaflet_扩展Leaflet:类(2017-10-26)

    扩展教程:http://leafletjs.com/examples/extending/extending-1-classes.html 翻译 该教程介绍扩展Leaflet最常用的方式. 注意:本文 ...

随机推荐

  1. Java虚拟机的相关笔记

    1.垃圾GC回收事件Minor GC(只清除新生代),Full GC(清除新生代和老年代),Major GC(清除新生.老年代和持久代). 2.堆分为新生代.老年代和持久代,持久代一般存放静态文件. ...

  2. linux 查看信息-服务器相关

    查看系统内核 查看磁盘信息 查看CPU的信息 查看内存相关信息

  3. NotificationMangerService处理显示通知

    设置——>应用——>点击“已下载”列表中的任一APP,如图:  代码位置:Settings\src\com\android\settings\applications\InstalledA ...

  4. create a plugin for PowerShell ISE

    可参考:Creating Add-ons, Plugins, and Tools for the PowerShell ISE http://www.leeholmes.com/blog/2013/0 ...

  5. http://itellyou.cn/

    http://itellyou.cn/ 这里提供了微软MSDN上所有能下载的软件. 下载完记得检验. 这是更详细的介绍:http://wenku.baidu.com/link?url=_dZ0mYvl ...

  6. 【RabbitMQ】 RabbitMQ安装

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间 ...

  7. rbenv安装本地ruby安装包

    cd .rbenv mkdir cache #把安装包拷进cache cd cache rbenv install 版本号

  8. 关于WEB前端,你必须了解的发展方向

    一.职业方向定位 首先,只有确定好自己的职业方向,才能做好职业规划.在我看来,做WEB前端技术能够找到的职业方向有以下几种: (1)资深WEB前端工程师 这个方向算是一个WEB前端最基本的选择了,在国 ...

  9. js中如何将数据获得2位小数以及对数据进行千分位划分

    js中toFixed(n) 方法可把 数字四舍五入为指定小数位数n的数字,注意:这个方法只能对数据类型为Number的数据起作用,包括float,int等.例如:   123.12345.toFixe ...

  10. if结构和逻辑运算符

    一 :if选择结构 语法结构: 01.单个if if(表达式){ 如果满足表达式 则执行的代码 } 02.if(表达式) else if(表达式){ 如果满足表达式 则执行的代码 }else{ 不满足 ...