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

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

相关推荐
LinXunFeng2 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg6 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭6 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒6 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭6 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
小bo波7 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
Hyyy7 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin8 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic8 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶9 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端