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博客

相关推荐

  1. WPF定义聚合模式传递消息

    2024-01-28 06:08:02       40 阅读
  2. WPF定义模版

    2024-01-28 06:08:02       12 阅读
  3. C#--WPF定义模板示例

    2024-01-28 06:08:02       10 阅读
  4. Wpf-定义状态

    2024-01-28 06:08:02       19 阅读
  5. Wpf-定义波纹Button

    2024-01-28 06:08:02       21 阅读
  6. wpf定义添加滚动条

    2024-01-28 06:08:02       34 阅读
  7. WPF模板

    2024-01-28 06:08:02       17 阅读
  8. C#WPF定义消息对话框

    2024-01-28 06:08:02       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-28 06:08:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-28 06:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-28 06:08:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-28 06:08:02       20 阅读

热门阅读

  1. 2023年企业网络安全预算情况分析

    2024-01-28 06:08:02       36 阅读
  2. VUE3 加载自定义SVG文件

    2024-01-28 06:08:02       36 阅读
  3. 模型训练trick篇

    2024-01-28 06:08:02       41 阅读
  4. MySQL封装JDBC为工具类(JDBC简化)

    2024-01-28 06:08:02       38 阅读
  5. MySQL 函数参考手册(MySQL 字符串函数)

    2024-01-28 06:08:02       28 阅读
  6. 中科大--高级数据库期末试卷

    2024-01-28 06:08:02       37 阅读
  7. MySQL 函数参考手册(MySQL 数值函数)

    2024-01-28 06:08:02       25 阅读
  8. mysql数据库的备份和恢复

    2024-01-28 06:08:02       34 阅读
  9. 基础算法--搜索与图论(2)

    2024-01-28 06:08:02       24 阅读
  10. 图论第一天|797.所有可能的路径 200. 岛屿数量

    2024-01-28 06:08:02       41 阅读
  11. vue项目使用element-plus

    2024-01-28 06:08:02       30 阅读
  12. 题记(32)--矩阵K次幂

    2024-01-28 06:08:02       32 阅读
  13. 【LeetCode-435】无重叠区间(贪心)

    2024-01-28 06:08:02       36 阅读
  14. el-tree实现多选、反选、指定选择

    2024-01-28 06:08:02       28 阅读
  15. Compose | UI组件(五) | Button 按钮组件

    2024-01-28 06:08:02       35 阅读
  16. 73. 矩阵置零

    2024-01-28 06:08:02       35 阅读