MVVM 简化的Messager类
看MVVMLight的Messager源码,自己实现了一个简单的Messager类。
Messager类可以在MVVM中,实现View与VM、VM与VM、View与View的通信。
public class Messager
{
private static Messager _MessageInstance;
private Dictionary<string,Action> _MessageCollection=new Dictionary<string,Action> ();
private Dictionary<string, ActionClass> _MessageTCollection = new Dictionary<string, ActionClass>(); public static Messager Default
{
get
{
if (_MessageInstance == null)
{
_MessageInstance = new Messager();
}
return _MessageInstance;
}
} public void Register(string key,Action action)
{
_MessageCollection.Add(key,action);
} public void Register<T>(string key, Action<T> action)
{
ActionClass<T> actionClass = new ActionClass<T>();
actionClass.action = action;
_MessageTCollection.Add(key, actionClass);
} public void Send(string key)
{
if (_MessageCollection.Keys.Contains(key))
{
_MessageCollection[key].Invoke();
}
} public void Send<T>(string key,T para)
{
if (_MessageTCollection.Keys.Contains(key))
{
ActionClass<T> actionClass=(ActionClass<T>) _MessageTCollection[key];
actionClass.action.Invoke(para);
}
} }
主要通过Register方法来注册,Send方法来触发。
比如,VM中需要显示一个窗体,为了不破坏MVVM模式,我们可以把显示窗体的方法写在View中,并注册到Messager
Messager.Default.Register<string>("ChangeControlShow", ExecuteChangedContrlShow);
private void ExecuteChangedContrlShow(string msg)
{
//some code...
}
在VM中调用
Messager.Default.Send<string>("ChangeControlShow","test");
Send有两个参数,第一个是方法的Key,根据这个Key,可以找到唯一的方法,
第二个参数是需要调用的方法的参数。
这样,你只要知道方法的key,在任何文件中,都可以调用注册的方法,不需要我们再去使用委托了。
MVVM 简化的Messager类的更多相关文章
- 【MVVM Light】Messager的使用
一.前言 在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况: 若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候 ...
- 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类
经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...
- MyBatis sqlsession 简化 使用工具类创建
2019-04-09 @Test public void Test() throws Exception { // 1.读取配置文件 String resource = "mybatis-c ...
- Struts2 | struts.xml文件中使用method属性和通配符简化action标签和Action处理类的编写
转自:https://www.jianshu.com/p/310e89ee762d 在Struts2框架中,我们知道基本的Action标签只能实现一个url请求对应一个Action处理类.那么我们如果 ...
- [转载]MVVM模式原理分析及实践
没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...
- MVVM Light须要注意的10个问题
MVVM Light须要注意的10个问题 从使用XAML技术基础開始(实际上并非非常久曾经).我便关注MVVM(Model – View – ViewModel)模式.偶然接触到MVVM Light不 ...
- mvc、mvp和mvvm
一.MVC 设计图: 可能由于MVP.MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM.因为后两种都是基于MVC发展而来的. 1 ...
- Java+7入门经典 - 6 扩展类与继承 Part 2/2
6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...
- Leaflet_扩展Leaflet:类(2017-10-26)
扩展教程:http://leafletjs.com/examples/extending/extending-1-classes.html 翻译 该教程介绍扩展Leaflet最常用的方式. 注意:本文 ...
随机推荐
- 自定义注解与validation结合使用案例
编写validation自定义注解: @Target({ ElementType.FIELD, ElementType.METHOD })@Retention(RetentionPolicy.RUNT ...
- ListView动态改变每一项的高度。
ListView中每一项的高度默认是相同的,除非超过其预定高度值,否则需要动点手脚. VariableSizedListView 继承 ListView然后重写protected override v ...
- 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)
传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...
- google pay app权限使用说明
android.permission.CAMERA. 个人中心使用头像时需要使用该权限. android.permission.READ_PHONE.获取用户DeviceId,作为用户单点登录唯一值.
- 5. Sports 体育运动
5. Sports 体育运动 (1) Sport is not only physically challenging,but it can also be mentally challenging. ...
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)
https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...
- bootstrap-glyph-customization
http://www.runoob.com/try/demo_source/bootstrap-glyph-customization.htm http://fontawesome.io/icons/
- Tomcat服务器的安装和配置
一.Tomcat下载 可以直接从Apache的网站上下载Tomcat(http://tomcat.apache.org/),进入首页后,在左边Download一栏可选择你要下载的版本,点击便可进入To ...
- Linux基础笔记
基本命令: man man 查看手册 (1)pwd 显示路径 (2)cd 切换路径 (3)ls -a;-l;-h;-i;-d (隐藏的:长列表显示:human显示:索引号:只显示列表) (4)c ...
- C++STL set
set set是一种集合容器,所包含的元素是唯一的,集合中的元素按一定顺序排列,元素插入过程是按排序规则插入,所以不能插入指定位置 set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树,插入和删除 ...