Avalonia中推荐使用CommunityToolkit.Mvvm的WeakReferenceMessenger实现MVVM消息通知,它基于弱引用、类型安全、支持token精准路由且自动解注册。
在Avalonia中实现MVVM的消息通知,最常用、最轻量且推荐的方式是使用 CommunityToolkit.Mvvm 内置的 WeakReferenceMessenger —— 它就是 Avalonia 社区主流的“Messenger”机制,无需额外安装 MVVM Light 或第三方消息总线。
它基于弱引用设计,避免内存泄漏,天然适配 Avalonia + CommunityToolkit.Mvvm 项目结构。关键点:
WeakReferenceMessenger.Default 访问string、AlbumViewModel、自定义类)this 订阅,会随生命周期自动清理比如点击按钮后通知主窗口刷新列表:
[RelayCommand]
void BuyMusic()
{
if (SelectedAlbum != null)
{
WeakReferenceMessenger.Default.Send(SelectedAlbum, "buyMusic");
}
}
这里 "buyMusic" 是 token,后续订阅必须用相同字符串才能收到。
在主窗口 ViewModel 的构造函数里注册监听
:
public MainWindowViewModel()
{
// 注册:监听 AlbumViewModel 类型 + "buyMusic" token 的消息
WeakReferenceMessenger.Default.Register(
this,
"buyMusic",
(recipient, message) =>
{
Albums.Add(new AlbumViewModel(message)); // 更新集合
});
}
注意:this 是接收方实例,确保能自动反注册;Albums 是 [ObservableProperty] 或手动实现 INotifyCollectionChanged 的集合,才能触发 UI 刷新。
如果需要传递更复杂语义(比如操作结果、错误码),可定义专用消息类:
public record OperationResult(bool Success, string Message, object? Data = null);
发送端:
WeakReferenceMessenger.Default.Send(new OperationResult(true, "保存成功", savedItem), "saveCompleted");
接收端只需改泛型类型:
WeakReferenceMessenger.Default.Register(this, "saveCompleted", (_, msg) => { if (msg.Success) ShowNotification(msg.Message, NotificationType.Success); });
基本上就这些。不复杂但容易忽略的是 token 字符串一致性、泛型类型匹配、以及确保接收方 ViewModel 实例生命周期与注册动作对齐 —— 只要守住这三点,Messenger 就很稳。