码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • WPF CommunityToolkit.Mvvm Messenger通讯


    文章目录

    • 环境
    • 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);
         }
     }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    发送

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

    Token区分

    WeakReferenceMessenger.Default.Register
    在里面可以传入两个泛型

    //订阅
    WeakReferenceMessenger.Default.Register<LogMessage,string>(this,"token", Recive);
    
    //发送
    //注意,这里的token必须完全一致
    WeakReferenceMessenger.Default.Send<LogMessage,string>(new LogMessage("发送信息"),"token");
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    有回调订阅发送

    如果要添加回调功能,需要ViewModel继承IRecipient>接口,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("我返回的消息"));
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

        public record LogMessage(string msg,Action<string> callback);
    
    • 1
  • 相关阅读:
    网络测试工具—— iperf2 安卓APK 下载 及简单使用
    第十五章《网络编程》第4节:基于UDP协议的网络编程
    重定向转发,接收请求参数及数据回显-P11,12
    单元测试实战(一)Controller 的测试
    哪个城市是中国的经济人口重心?
    各种框架的面试
    Go 语言错误处理方式
    无线测温系统在电厂的必要性,保障电力系统稳定运行
    2021数学建模C题目– 生产企业原材料的订购与运输
    原生js值之数据类型详解
  • 原文地址:https://blog.csdn.net/qq_44695769/article/details/132649962
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号