WPF CommunityToolkit.Mvvm Messenger通讯

news2025/1/18 8:52:29

文章目录

  • 环境
  • WeakReferenceMessenger
    • 方法介绍
    • 无回调订阅发送
    • Token区分
    • 有回调订阅发送

环境

在这里插入图片描述

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

WeakReferenceMessenger

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

方法介绍

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

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

无回调订阅发送

//声明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);
     }
 }


发送

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

Token区分

WeakReferenceMessenger.Default.Register<TMessage,Ttoken>
在里面可以传入两个泛型

//订阅
WeakReferenceMessenger.Default.Register<LogMessage,string>(this,"token", Recive);

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


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

有回调订阅发送

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

    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去回调,这里不展开说明

    public record LogMessage(string msg,Action<string> callback);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 之 Start 与 Awake 的区别

文章目录 在Unity中&#xff0c;Awake和Start都是用于脚本中的生命周期方法&#xff0c;用于控制游戏对象在不同阶段的初始化和行为。它们之间的区别在于调用的时间和用途。 Awake: Awake 是一个在游戏对象被实例化时首先调用的方法。它在对象被加载到场景中但在启用之前调用。…

找到自制电子杂志的方法了,快来看看?

终于找到自制电子杂志的方法了&#xff0c;这真是令人兴奋啊&#xff01;现在&#xff0c;我们可以利用这个方法来创造属于自己的电子杂志&#xff0c;将我们的想法和创意以独特的方式展现给世界。 1.需要一个电子杂志制作工具 市面上有许多专门用于制作电子杂志的工具&#x…

消灭怪物的最大数量【力扣1921】

一、题目分析 需要满足的条件&#xff1a; 只能在每分钟的开始使用武器武器能杀死距离城市最近的怪兽怪兽到达城市就会输掉游戏 游戏最优策略&#xff1a;我们可以在每分钟的开始都使用一次武器&#xff0c;用来杀死距离城市最近的怪兽。这样可以在力所能及的范围内&#xf…

文件及Java中File类详解

目录 一, 文件 1,什么是文件 2,路径 二, File类 1,File类的构造方法 签名 说明 2,File类的方法 修饰符及返回值类型 方法签名 说明 2.1,get方法的使用 2.2,普通文件的创建以及删除 2.3,普通目录文件的创建以及删除 3,代码示例 示例1 示例2 一, 文件 1,什么是文…

聊聊每日站会

这是鼎叔的第七十四篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 每日站会是一线敏捷团队自己的会议&#xff0c;快速同步成员为达成迭代目标所…

对象模型和this指针(个人学习笔记黑马学习)

1、成员变量和成员函数 #include <iostream> using namespace std; #include <string>//成员变量和成员函数分开存储class Person {int m_A;//非静态成员变量 属于类的对象上的static int m_B;//静态成员变量 不属于类的对象上void func() {} //非静态成员函数 不…

必读干货!独立站新手卖家常见十大问题解答

新手卖家入局跨境电商独立站&#xff0c;会考虑到很多问题&#xff0c;从网站到产品再到售卖最终的发货。而且卖家普遍对独立站存在认知不全的问题&#xff0c;门槛高、推广难、转化难是最初印象。 那独立站该怎么开始&#xff0c;如何下手&#xff1f;今天整理并解答独立站新…

【大模型AIGC系列课程 3-3】低成本的领域私域大模型训练方法

重磅推荐专栏: 《大模型AIGC》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地…

读余华小说《兄弟》

上部读完的一些笔记和思考&#xff0c;下部 TODO 时间&#xff1a;上世纪6、70年代 地点&#xff1a;刘镇 人物&#xff1a;故事中的兄弟指的是&#xff1a;宋钢(兄)&#xff0c;李光头&#xff08;弟&#xff09;&#xff0c;如下为简单的人物和命运图 一些故事&#xff1a;…

【Golang】函数篇

1、golang函数基本定义与使用 func 函数名 (形参列表) (返回值类型列表) {函数体return 返回值列表 }其中func用于表明这是一个函数&#xff0c;剩下的东西与其他语言的函数基本一致&#xff0c;在定义与使用的时候注意函数名、参数、返回值书写的位置即可。下面使用一个例子…

linux 下安装配置nexus

一、安装包获取方式 方式一 1、直接把下载好的安装包上传到服务器中 方式二 2、通过wget安装Nexus压缩包 ①、可以使用以下命令进行安装Nexus的最新版本 wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz②、也可以点击官网复制想要下载的Nexus压缩包进行安装…

腾讯云免费SSL证书申请流程_2023更新教程

2023腾讯云免费SSL证书申请流程&#xff0c;一个腾讯云账号可以申请50张免费SSL证书&#xff0c;免费SSL证书为DV证书&#xff0c;仅支持单一域名&#xff0c;申请腾讯云免费SSL证书3分钟即可申请成功&#xff0c;免费SSL证书品牌为TrustAsia亚洲诚信&#xff0c;腾讯云百科分享…

jupyter notebook 魔术命令介绍和简单使用

在Jupyter notebook中&#xff0c;“魔法命令”是特殊的命令&#xff0c;不是Python语言的一部分&#xff0c;但可以使您的生活更轻松。这些命令前面有%符号。 魔法命令很有用&#xff0c;可以直接嵌入到python代码中&#xff0c;并解决常见问题&#xff0c;例如列出当前目录中…

分布式session的4种解决方案

分布式session的4种解决方案 1、cookie和session cookie和session都是用来跟踪用户身份信息的会话方式。 cookie存储的数据保存在本地客户端&#xff0c;用户获取容易&#xff0c;但安全性不高&#xff0c;存储数据小。 session存储的数据保存在服务器&#xff0c;用户不易获取…

Ubuntu中安装clion并把clion添加到桌面快捷方式

Clion的安装&#xff1a; CLion是由大名鼎鼎的JetBrains公司出品的一款面向C和C的集成开发工具。下载地址。 下载后解压出来&#xff0c;然后进入到解压后的文件夹里面&#xff0c;执行 ./clion.sh 便可以运行软件&#xff1a; cd bin/ ./clion.sh 激活使用的话&…

亚马逊庭院类目或迎来显著增长;倩碧使用TikTok全新搜索广告功能

夏季即将结束&#xff0c;但Jungle Scout Cobalt数据显示&#xff0c;亚马逊的Patio, Lawn & Garden类目仍将迎来显著的季节性增木 除了夏季销售的飙升&#xff0c;Generators & Portable Power发电机和便携式电源子类别的销售一般会在初秋和假日季节会迎来大幅增长&a…

820. 单词的压缩编码

820. 单词的压缩编码 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__820单词的压缩编码__存储后缀__820单词的压缩编码__字典前缀树 原题链接&#xff1a; 820. 单词的压缩编码 https://leetcode.cn/problems/short-encoding-of-word…

从Matrix-ResourceCanary看内存快照生成-ForkAnalyseProcessor(2)

不同于LeakCanary,在Matrix中,主要是通过Resource Canary来监控内存泄漏问题的,且监听的泄漏对象只支持Activity,官方说明如下: 结合分析LeakCanary的经验可知,要实现Activity内存泄漏监听,总体上应该要实现两大功能: Activity生命周期监控查找泄漏对象并得到GC Root P…

2023-9-3 分解质因数

题目链接&#xff1a;分解质因数 #include <iostream>using namespace std;void divide(int n) {for(int i 2; i < n / i; i ){if(n % i 0){int res 0;while(n % i 0){n / i;res ;}cout << i << << res << endl;}}if(n > 1) cout &l…

ZDH-权限模块

本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…