CommunityToolkit.Mvvm8.1 消息通知(4)

本系列文章导航
  1. https://www.cnblogs.com/aierong/p/17300066.html
  2. https://github.com/aierong/WpfDemo (自我Demo地址)

 

希望提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:https://www.cnblogs.com/aierong

 

说明

为了应用程序的不同模块分离,减少模块之间引用,CommunityToolkit.Mvvm提供了消息通知功能,可以方便模块之间数据传递。

 

发送消息

方法:WeakReferenceMessenger.Default.Send

官方推荐用ValueChangedMessage封装数据传递

//Send发送消息
WeakReferenceMessenger.Default.Send<string>( "qq1" );

//特别注意:直接传递值,只可以是引用类型,值类型不可以编译成功的(例如:下面2句不行)
//WeakReferenceMessenger.Default.Send<int , string>( 11 , "token_1" );
//WeakReferenceMessenger.Default.Send<bool , string>( true  , "token_1" );

//上面这样也是可以的,但是官方推荐用ValueChangedMessage封装数据传递
WeakReferenceMessenger.Default.Send<ValueChangedMessage<string> , string>( new ValueChangedMessage<string>( "UserControlLeftViewModel发来的qq1" ) , "token_1" );

建议发送消息时都带上token名称,这样方便订阅接收方过滤数据 

WeakReferenceMessenger.Default.Send<ValueChangedMessage<string> , string>( new ValueChangedMessage<string>( "UserControlLeftViewModel发来的qq1" ) , "token_1" );

 

发送消息传递对象

    public class MyUserMessage
    {
        public string UserName
        {
            get; set;
        }

      

        public int Age
        {
            get; set;
        }
    }
//Send发送 一个复杂数据 
var _data1 = new MyUserMessage() { Age = 18 , UserName = "qq" };
           
WeakReferenceMessenger.Default.Send<ValueChangedMessage<MyUserMessage> , string>( new ValueChangedMessage<MyUserMessage>( _data1 ) , "token_class" );

 

发送消息并有返回响应值

    /// <summary>
    /// 必须继承RequestMessage  RequestMessage<string>代表返回数据的类型是string
    /// </summary>
    public class MyMessage : RequestMessage<string>
    {
        public string Datas;

        public int Ids;
    }
            //result接收返回的值
            //MyMessage这个类必须继承RequestMessage
            var _data2 = new MyMessage() { Datas = "qqq" , Ids = 100 };
            var result1 = WeakReferenceMessenger.Default.Send<MyMessage , string>( _data2 , "token_Response" );
            if ( result1 != null )
            {
                //获取到 返回的值
                var val = result1.Response;

                Name = val;

            }

 

 

接收订阅消息

接收2种方式:

方式1.继承ObservableRecipient  

方式2.实现接口IRecipient

方式1比方式2灵活,推荐使用方式1

 

接收方记得设置IsActive=true,才可以收到消息

我们在vm的OnActivated中接收消息数据

        [ObservableProperty]
        private string name = "hello";

        public UserControlTopViewModel ()
        {
            //注意这样要写,才可以接听
            IsActive = true;
        }
        protected override void OnActivated ()
        {
            //Register<>第一个类型一般是自己的类型,第2个是接收数据的类型
            //Register方法第1个参数一般是this,第2个参数是一个方法,可以获取接收到的值
            Messenger.Register<UserControlTopViewModel , string>( this , ( r , message ) =>
            {
                Name = Name + "  收到msg:" + message;
            } );

            //Register<>第一个类型一般是自己的类型,第2个是接收数据的类型,第3个是token数据的类型
            //Register方法第1个参数一般是this,第2个参数是token,第3个参数是一个方法,可以获取接收到的值
            //Messenger.Register<UserControlTopViewModel , string , string>( this , "token_1" , ( r , message ) =>
            //{

            //    Name = Name + "  收到msg:" + message;
            //} );
            //ValueChangedMessage<string>                  
            Messenger.Register<UserControlTopViewModel , ValueChangedMessage<string> , string>( this , "token_1" , ( r , message ) =>
            {

                Name = Name + "  收到msg:" + message.Value;
            } );



            //Messenger.Register<UserControlTopViewModel , MyUserMessage , string>( this , "token_class" , ( r , user ) =>
            //{
            //    Name = Name + "  收到msg:" + user.UserName + user.Age;
            //} );
            Messenger.Register<UserControlTopViewModel , ValueChangedMessage<MyUserMessage> , string>( this , "token_class" , ( r , user ) =>
            {
                Name = Name + "  收到msg:" + user.Value.UserName + user.Value.Age;
            } );


            Messenger.Register<UserControlTopViewModel , MyMessage , string>( this , "token_Response" , ( r , message ) =>
            {
                Name = Name + "  收到msg:" + message.Datas;

                //Reply是答复 ,这样可以返回值
                message.Reply( "UserControlTopViewModel给你返回值" );      

            } );
        }

 

自我Demo地址:

https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6/MessengerDemo

 

原文链接:https://www.cnblogs.com/aierong/p/17318525.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CommunityToolkit.Mvvm8.1 消息通知(4) - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • 记一次 .NET 某外贸ERP 内存暴涨分析

    一:背景 1. 讲故事 上周有位朋友找到我,说他的 API 被多次调用后出现了内存暴涨,让我帮忙看下是怎么回事?看样子是有些担心,但也不是特别担心,那既然找到我,就给他分析一下吧。 二:WinDbg 分析 1. 到底是哪里的泄露 这也是我一直在训练营灌输的理念,一定要知道是哪一边的暴涨,否则很可能就南辕北辙了,使用 !address -summary 和 !…

    C# 2023年4月27日
    00
  • C#集合之位数组的用法

    C#集合之位数组的用法 介绍 位数组(BitArray)是C#中的一种特殊集合类型,用于存储0和1位的值,常用于大规模数据的标记和处理。在C#中,位数组是System.Collections命名空间下的一个类,可以通过创建新的BitArray实例来使用和操作。本文将介绍如何使用C#中的位数组,包括创建实例、初始化、添加或修改元素、访问元素、遍历等基本操作。并…

    C# 2023年6月7日
    00
  • asp.ent(C#)中判断空字符串的3种方法以及性能分析

    让我来为你详细讲解“asp.net(C#)中判断空字符串的3种方法以及性能分析”的攻略。 问题背景 在程序开发中判断字符串是否为空是常见的一项任务。ASP.NET(C#)中也有多种方式来判断一个字符串是否为空。在选择使用哪种方式时,我们需要考虑到每种方式的性能,因为字符串的判断在程序中频率很高。本攻略将对三种ASP.NET中判断空字符串的方式进行介绍,并对它…

    C# 2023年5月15日
    00
  • C#仿密保卡功能的简单实现代码

    下面是关于“C#仿密保卡功能的简单实现代码”的完整攻略: 1. 什么是仿密保卡功能? 仿密保卡,顾名思义,是指通过某些方法实现和模拟传统的硬件密保卡的功能。传统的硬件密保卡大多采用一些特定的加密算法和密码体系,将用户的身份信息和敏感数据存储在卡片内部,在用户身份验证和数据交换等场景中发挥重要作用。 仿密保卡则是通过软件的方式实现这些功能,不需要依赖于硬件卡片…

    C# 2023年6月6日
    00
  • C#字符串String及字符Char的相关方法

    下面就是关于 C# 字符串 String 及字符 Char 相关方法的详细攻略。 字符串 String 字符串简介 C# 中的字符串是一组字符的集合,用双引号引起来的字符序列,在 C# 中被认为是值类型。字符串可以包含任何字符,包括特殊字符、数字和字母。 C# 字符串是不可改变的,也就是说,一旦创建了一个字符串对象,就不可以改变它。 字符串的方法 C# 的 …

    C# 2023年5月15日
    00
  • C#枚举类型和结构体详解

    C#枚举类型和结构体详解 枚举类型 C#中的枚举类型是一种特殊的数据类型,用于定义常量。它可以帮助我们在程序中使用更加直观的符号来代表特定的整数值。枚举类型的定义语法如下: enum 枚举名称 { 常量1, 常量2, … } 其中,枚举名称是标识枚举类型的名称,常量1、常量2等是枚举类型中定义的常量,可以指定特定的值,也可以不指定,如果不指定,则默认从0…

    C# 2023年6月8日
    00
  • C# 如何使用 Index 和 Range 简化集合操作

    C# 8.0 引入了一种新的索引(Index)和范围(Range)语法,这两个语法可以方便地获取集合中的特定元素,从而简化集合的操作。接下来,我将为大家详细讲解如何使用 Index 和 Range 简化集合操作。 Index 和 Range 的语法 Index 和 Range 的语法非常简单,可以用以下两种方式来表示: 使用索引,例如使用“^”符号表示索引的…

    C# 2023年6月6日
    00
  • C# 中使用Stopwatch计时器实现暂停计时继续计时功能

    下面是详细讲解“C# 中使用Stopwatch计时器实现暂停计时继续计时功能”的完整攻略。 步骤一:引入命名空间 在使用Stopwatch计时器之前,需要先引入System.Diagnostics命名空间,可以通过以下代码实现: using System.Diagnostics; 步骤二:创建Stopwatch计时器对象 在正式使用Stopwatch计时器之…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部