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

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

相关推荐
她的男孩5 分钟前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
kyriewen5 分钟前
我用 AI 写完一个需求后才发现,最难的不是 prompt,而是验收
前端·程序员·ai编程
申行8 分钟前
Vue 3 + DYMO Connect Framework 实战:从标签模板到打印服务的完整实现
前端
两只羊ovo8 分钟前
Vue 3 + DeepSeek 流式输出实战:从“干等”到“打字机”体验
前端·vue.js
Yeyu11 分钟前
车载多 App 同屏渲染(二):SurfaceControlViewHost 跨进程
前端
樊小肆12 分钟前
离谱,每轮请求 25% 的 token,竟在重发模型想完就扔的内心独白
前端·人工智能·agent
小妖现世18 分钟前
前端面试复习笔记:React 高频题 + JS 手写题
前端
holidaypenguin19 分钟前
Windows 本地 HTTPS 证书生成指南
前端
酷酷的逗逗乐23 分钟前
前端转 Agent 开发 · 第六节
前端·程序员
回家吃饭去吧25 分钟前
WebAssembly 深度解析:前端性能的最后一块拼图
前端