C# CommunityToolkit.Mvvm全局事件

实现全局事件定义,可以自动回收

第一步:nuget安装CommunityToolkit.Mvvm

第二步:定义一个通讯类

csharp 复制代码
/// <summary>
/// 信息通讯
/// </summary>
public class GlobalMessage
{
    /// <summary>
    /// 菜单通讯
    /// </summary>
    /// <param name="MenuName">主菜单名称</param>
    /// <param name="SonMenuName">子菜单名称</param>
    /// <param name="Datas">数据</param>
    public record MenuChangedMessage(Window mainWindow, string MenuName, string SonMenuName = "", object Datas = null);
}

第三步:订阅

csharp 复制代码
WeakReferenceMessenger.Default.Register<MenuChangedMessage>(this, (r, m) =>
{
	if (m.mainWindow == this)
	{
	    SetMenu(m.MenuName, m.SonMenuName, m.CantileverNo, m.Datas);
	}
});

第四步:发送

csharp 复制代码
WeakReferenceMessenger.Default.Send(new MenuChangedMessage(this._mainWindow, _sonMenuName, "", 0, _currentFeederDatas));

注意重复订阅与订阅之后重复触发(非重复发送)解决方案

csharp 复制代码
public partial class GuideOperationPopView : UserControl, INotifyPropertyChanged, IBaseClass, IRecipient<MenuChangedMessage>
{
	// 其他代码
	// 订阅修改
    public GuideOperationPopView(Window mainWindow)
    {
        InitializeComponent();
        
        // 先注销,再注册
        WeakReferenceMessenger.Default.Unregister<GlobalTransmitInformationToFromEvent>(this);
        WeakReferenceMessenger.Default.Register<GlobalTransmitInformationToFromEvent>(this); // 会调用 Receive 方法
	}
	
	// 实现接口
    public void Receive(MenuChangedMessage message)
    {
        // 业务处理
    }
}

主要看IRecipient<MenuChangedMessage>将注册交给接口处理,步骤三的写法也是可以的,但是尽量避免线程中发送订阅,如果涉及到线程最好用最后提供的解决方法。

以上提供的代码因为有一部分涉及到业务就没有写,自己写的时候根据这个完善一下。

相关推荐
Aision_9 小时前
从工具调用到 MCP、Skill完整学习记录
java·python·gpt·学习·langchain·prompt·agi
倾颜11 小时前
从 textarea 到 AI 输入框:用 Tiptap 实现 / 命令、@ 引用和结构化请求
前端·langchain·next.js
kyriewen12 小时前
程序员连夜带团队跑路,省了23万:这AI太贵,真的用不起了
前端·javascript·openai
kyriewen13 小时前
你写的代码没有测试,就像出门不锁门——Jest + Testing Library 从入门到不慌
前端·单元测试·jest
zc.z13 小时前
JAVA实现:纯PCM格式音频转换成BASE64
java·音视频·pcm
mask哥13 小时前
力扣算法java实现汇总整理(上)
java·算法·leetcode
yuzhiboyouye14 小时前
web前端英语面试
前端·面试·状态模式
如果'\'真能转义说14 小时前
OOXML 文档格式剖析:哈希、ZIP结构与识别
xml·算法·c#·哈希算法
我是唐青枫14 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
redis·缓存·c#·.net
Aaswk15 小时前
Java Lambda 表达式与流处理
java·开发语言·python