MVVM简化的Messager类实例代码
作者:liuyong111 发布时间:2023-12-23 07:37:50
标签:mvvm,messager类,简化
前言
在开发Wpf/SL应用时,经常会遇到不同页面和窗体之间的参数传递的问题。对于这类问题,我们一般通过事件实现数据传递,也可以定义全局静态变量来进行数据共享。这里我们则使用了另外一种非常高效而优雅的方法来进行消息传递,这里我称之为Messenger,事实上,Messenger并非mvvm的专利,我们可以把它看作一种设计模式,你可以在其它.net程序中使用它。
简化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,在任何文件中,都可以调用注册的方法,不需要我们再去使用委托了。
来源:https://www.cnblogs.com/czly/archive/2018/06/12/9172766.html


猜你喜欢
- 一、概述1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换2.思路:(
- 最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现。需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下
- 本文实例为大家分享了javafx实现时钟效果的具体代码,供大家参考,具体内容如下核心为三个函数:第一个为 public void dials
- 本文实例讲述了java图片滑动验证(登录验证)原理与实现方法。分享给大家供大家参考,具体如下:这是我简单做出的效果图,处理300X150px
- spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller publ
- 本文记录了用自定义Camera实现的简单拍照功能。Camera类在5.0以后不推荐使用了,取而代之的是android.hardware.ca
- 前言反射和注解在java中偏高级用法,一般在各种框架中被广泛应用,文章简单介绍下反射和注解的用法,希望对你的工作学习有一定帮助java注解什
- 本文实例讲述了Android编程实现将应用强制装到手机内存的方法。分享给大家供大家参考,具体如下:在Froyo(android 2.2,AP
- 简介GraalVM是高性能的JDK,支持Java/Python/JavaScript等语言。它可以让Java变成二进制文件来执行,让程序在任
- 一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下;所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其
- SpringBoot在annotation的层面实现了数据缓存的功能,基于Spring的AOP技术。所有的缓存配置只是在annotation
- 1.编写核心类MainApp:package com.yiidian.gson;import com.google.gson.Gson;im
- 前天在做批量数据导入新增时,要对数据进行有效性判断,其中还要去除重复,如果没出现linq的话可能会新声明一个临时对象集合,然后遍历原始数据判
- 一个简单的微服务架构图本文设计的 Spring Cloud 版本以及用到的 Spring Cloud 组件Spring Cloud Hoxt
- 前言本文主要给大家介绍了关于C#中foreach遍历的用法以及c#使用foreach需要知道的一些事,分享出来供大家参考学习,下面话不多说了
- 本文实例讲述了C#画笔使用复合数组绘制单个矩形的方法。分享给大家供大家参考。具体实现方法如下:using System;using Syst
- Spring注解AspectJ操作AOP一、被增强类新建一个被增强的类 User,下面有个 add() 方法。package com.pin
- 要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉。在这里我使用Newtonsoft.Json.dll记
- 这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 传播inbound事件有关于inbound事件, 在概述中做过简单的介绍, 就是以自己为基准, 流向自己的事件, 比如最常见的channel