实现全局事件定义,可以自动回收
第一步: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>将注册交给接口处理,步骤三的写法也是可以的,但是尽量避免线程中发送订阅,如果涉及到线程最好用最后提供的解决方法。
以上提供的代码因为有一部分涉及到业务就没有写,自己写的时候根据这个完善一下。