WPF CommunityToolkit.Mvvm Messenger通讯

文章目录

环境

CommunityToolkit.Mvvm Messenger
十月的寒流: 如何使用 CommunityToolkit.Mvvm 中的 Messenger 来进行 ViewModel 之间的通信

WeakReferenceMessenger

我这里只讲简单的弱Messenger,这个是Toolkit帮我们封装好的,里面好像有什么垃圾回收什么的,里面怎么运行的我也没去研究。我这里就简单讲解一下怎么用

方法介绍

  • WeakReferenceMessenger.Default.Register
    • 订阅消息
  • WeakReferenceMessenger.Default.Send
    • 接收消息

为了保证一对一,我们注册和发送的时候需要用到record结构体==(我后面试了一下,当然也可以不用,单纯一个类也行)==。因为这个是根据type的name来进行订阅和发送的。
C# 9.0:Records 结构体介绍

无回调订阅发送

csharp 复制代码
//声明record
//类型可以自定义,是通过record的类名自动订阅和发送的
public record LogMessage(string msg);

///在viewModel里面订阅
 public partial class ListViewModel 
 {



     public ListViewModel()
     {
     	//在构造函数里面订阅。注意订阅一定是你接受的消息类型
     	//第一个是订阅者,默认是本身,就是this
         WeakReferenceMessenger.Default.Register<LogMessage>(this, Recive);
     }
	//recipient 就是把订阅者,也就是ViewModel传给你,一般用不上
	//第二个参数是你的Recive的值
     public void Recive(object recipient, LogMessage msg)
     {
         Debug.WriteLine("ListViewModel:" + msg.msg);
     }
 }

发送

csharp 复制代码
//发送和接受的类型一定是一致的
WeakReferenceMessenger.Default.Send<LogMessage>(new LogMessage("lala"));

Token区分

WeakReferenceMessenger.Default.Register<TMessage,Ttoken>

在里面可以传入两个泛型

csharp 复制代码
//订阅
WeakReferenceMessenger.Default.Register<LogMessage,string>(this,"token", Recive);

//发送
//注意,这里的token必须完全一致
WeakReferenceMessenger.Default.Send<LogMessage,string>(new LogMessage("发送信息"),"token");

这里Token建议使用enum枚举类型,方便静态编译和纠错

有回调订阅发送

如果要添加回调功能,需要ViewModel继承IRecipient<RequestMessage<TMessage>>接口,TMessage和上面一样,都是订阅对象

csharp 复制代码
    public partial class LogViewModel : ObservableObject,IRecipient<RequestMessage<LogMessage>>
    {
        [ObservableProperty]
        private string title = "控制台界面";



        public LogViewModel()
        {
        	//接口必须实现
            WeakReferenceMessenger.Default.Register(this);
        }
		
		//消息返回
        public void Receive(RequestMessage<LogMessage> message)
        {
            
            Debug.WriteLine("我接受到了消息"+ message.Response.msg);

            message.Reply(new LogMessage("我返回的消息"));
        }

    }

但是感觉并不是很好用,因为这样就没有Token了,而且回调的类型和传入的类型是一致的,这个太死板了,可以通过record里面定义一个Action去回调,这里不展开说明

csharp 复制代码
    public record LogMessage(string msg,Action<string> callback);
相关推荐
500841 天前
鸿蒙 Flutter 权限管理进阶:动态权限、权限组、兼容处理与用户引导
flutter·华为·架构·wpf·开源鸿蒙
500841 天前
鸿蒙 Flutter 蓝牙与 IoT 开发进阶:BLE 设备连接、数据交互与设备管理
flutter·华为·electron·wpf·开源鸿蒙
Macbethad1 天前
工业设备系统管理程序技术方案
大数据·wpf
500841 天前
鸿蒙 Flutter 混合栈开发:与 React Native/ArkTS 页面无缝集成(2025 爆火方案)
flutter·华为·electron·wpf·开源鸿蒙
拾七片晚星2 天前
MateChat工作流引擎实战:复杂任务自动化编排与异常处理
wpf·devui·matechat
Aevget2 天前
界面控件开发包DevExpress v25.1.7更新上线——修复一些小bug
c#·wpf·winform·devexpress·ui开发·用户界面
_oP_i2 天前
winform与wpf的对比
wpf
她说彩礼65万2 天前
WPF Converter转换器
wpf
她说彩礼65万2 天前
C# Thread和Task的区别
wpf
张人玉2 天前
C#编写西门子S7PLC通信的相关知识点
microsoft·c#·wpf·plc·西门子s7通信