当前位置: 首页 > news >正文

WPF自定义控件,聚合器模式传递消息

背景:自定义控件的消息传递和方法的调用可以使用聚合器来进行

定义聚合器:

public class EventAggregator
{public static ConcurrentDictionary<Type, List<Action<object>>> _handles = new ConcurrentDictionary<Type, List<Action<object>>>();// 订阅方法public void Register<T> (Action<object> action){if (!_handles.ContainsKey(typeof (T))){_handles[typeof (T)] = new List<Action<object>> ();}_handles[typeof(T)].Add(action);Debug.WriteLine(_handles[typeof(T)].Count);}// 给数据给调用的方法public void Send<T> (object obj){if (_handles.ContainsKey(typeof(T))){foreach (var actionin in _handles[typeof(T)]){actionin?.Invoke(obj);}}}}

使用单例模式访问聚合器:

public class EventAggregatorRepository
{public EventAggregator eventAggregator;private static EventAggregatorRepository aggregatorRepository;private static object _lock = new object();public EventAggregatorRepository(){eventAggregator = new EventAggregator();}// 单例,只要一个事件聚合器public static EventAggregatorRepository GetInstance(){if (aggregatorRepository == null){lock (_lock){if (aggregatorRepository == null){aggregatorRepository = new EventAggregatorRepository();}}}return aggregatorRepository;}}

在发送消息的控件中:

public SendMsgControlViewModel()
{SendMsgCommand = new RelayCommand<Student>(SendMsg);
}private void SendMsg(object t)
{Student student = new Student(){Name = "梨花",Id = 12,};EventAggregatorRepository.GetInstance().eventAggregator.Send<Student>(student);
}

接收消息的控件中

public MainWindowViewModel()
{EventAggregatorRepository.GetInstance().eventAggregator.Register<Student>(ShowData);
}private void ShowData(object obj)
{Student student = (Student)obj;Receive = student.Name;  // 需要显示的属性绑定MessageBox.Show(Receive);
}

相关:WPF中MVVM手动实现PropertyChanged和RelayCommand-CSDN博客

相关文章:

  • 面试题整理
  • C语言每日一题(49)二叉树的三种基本遍历方法
  • Web开发8:前后端分离开发
  • 华为笔记本matebook pro X如何扩容 C 盘空间
  • 解析PDF二维码:数字时代文件管理的创新之道
  • 【数据结构:顺序表】
  • mysql之基本查询
  • 51单片机点灯
  • 数字身份保护:Web3如何改变个人隐私观念​
  • YOLOv8实例分割实战:TensorRT加速部署
  • 基于STM32的CAN通信协议选择与实现
  • LeetCode_16_中等_最接近的三数之和
  • 【网络】:网络套接字(UDP)
  • 用Visual Studio Code创建JavaScript运行环境【2024版】
  • ❤搭建一个Springboot项目(ltbjava)
  • 收藏网友的 源程序下载网
  • 【知识碎片】第三方登录弹窗效果
  • 07.Android之多媒体问题
  • Apache的基本使用
  • github从入门到放弃(1)
  • Git同步原始仓库到Fork仓库中
  • HTTP那些事
  • Linux各目录及每个目录的详细介绍
  • Vue2 SSR 的优化之旅
  • vue-cli3搭建项目
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 多线程 start 和 run 方法到底有什么区别?
  • 高度不固定时垂直居中
  • 检测对象或数组
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 听说你叫Java(二)–Servlet请求
  • 智能合约开发环境搭建及Hello World合约
  • 阿里云API、SDK和CLI应用实践方案
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • #数据结构 笔记一
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.11) SiK Radio v2(一)
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LeetCode C++)盛最多水的容器
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (利用IDEA+Maven)定制属于自己的jar包
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十八)Flink CEP 详解
  • (十一)图像的罗伯特梯度锐化
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)ObjectiveC 深浅拷贝学习
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET MAUI Sqlite程序应用-数据库配置(一)