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

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

相关推荐
方华世界8 分钟前
企业级Java AI Agent应用平台
java·开发语言·人工智能
吴可可1239 分钟前
C# CAD二次开发自定义实体实现
c#
折哥的程序人生 · 物流技术专研37 分钟前
第8篇:模板方法模式的优缺点与面试高频考点
java·设计模式·面试·模板方法模式·行为型模式·优缺点·扩充系列
李明卫杭州41 分钟前
Vue2 portal-target 组件与 Vue3 的针对性优化
前端·javascript·vue.js
人道领域1 小时前
【0-1的agent进阶篇】Prompt 与上下文工程
java·开发语言·prompt·mcp
z落落1 小时前
C# WinForm 线程池与事件等待+进度条暂停恢复实战案例
开发语言·c#
KINGSEA_1682 小时前
AgentScope Java 2.0 架构解析
java
Tyler_12 小时前
iOS PlayWright mcp server
前端·ios·ai编程
嘟嘟07172 小时前
从零理解 MCP:手写一个本地 MCP Server 并接入 LangChain Agent
前端·后端
cocoafei2 小时前
GPT-5.6 后,别再混淆 ChatGPT 和 Codex 额度了
前端·人工智能·chatgpt