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/archive/2023/04/14/17318525.html

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

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

相关文章

  • C#调用带结构体指针Dll的方法

    下面我将详细讲解一下“C#调用带结构体指针Dll的方法”的完整攻略。 1.准备工作 首先,我们需要一份带有结构体指针参数的dll库文件,并在C代码中进行相应的编写。还需要在C#中定义相应的结构体来匹配C语言中的结构体类型。 在C#代码中需要引入DllImport特性,来告诉C#编译器我们要调用的是一个外部的dll库函数。 2.C#结构体定义 结构体是两端交互…

    C# 2023年5月15日
    00
  • C#线程入门教程之单线程介绍

    下面我将详细讲解一下“C#线程入门教程之单线程介绍”的完整攻略。 1. 什么是线程? 在介绍单线程之前,我们先来了解一下什么是线程。在计算机中,线程是进程内部的一个独立执行流,用于执行并发任务。与进程不同,线程之间共享同一进程的内存和文件,可以方便地协同工作。 2. 单线程 单线程指的是程序只有一个线程在执行任务。在此种情况下,一个任务必须等待另一个任务完成…

    C# 2023年6月7日
    00
  • 代码实现打印功能(asp.net+javascript)

    下面是代码实现打印功能的完整攻略。 1. 前言 在 ASP.NET 中实现打印功能,主要需要使用 JavaScript 的 window.print() 方法,将当前页面的内容打印出来。在打印前可能还需要进行一些页面内容的样式调整、打印内容的选择等操作。下面我们将详细介绍如何使用 ASP.NET 和 JavaScript 实现打印功能。 2. 准备工作 在 …

    C# 2023年5月31日
    00
  • 在asp.net网页中显示数学符号的代码

    在ASP.NET网页中显示数学符号需要使用数学符号字体库或者LaTeX语法进行处理。下面我来分别介绍这两种方法的使用。 使用数学符号字体库 步骤一:下载数学符号字体库 在网上搜索下载数学符号字体库,比如说“MathJax”等,将下载得到的.zip文件解压缩得到字体库文件夹。 步骤二:引入字体库文件 将第一步得到的字体库文件夹拷贝到您的ASP.NET网站根目录…

    C# 2023年5月31日
    00
  • C#中WPF依赖属性的正确学习方法

    C#中WPF依赖属性的正确学习方法 什么是依赖属性 在WPF中,依赖属性(Dependency Property)是一种特殊的属性,它比普通属性具有更高的灵活性和可扩展性。它允许我们在多个元素之间共享属性值,并且能够提供诸如数据绑定、动画效果等高级功能。 依赖属性的学习方法 1. 理解依赖属性的本质 在学习依赖属性之前,我们首先需要理解依赖属性的本质。依赖属…

    C# 2023年5月31日
    00
  • 流放之路2.4贵族老鹿近战图腾开荒build分享

    流放之路2.4贵族老鹿近战图腾开荒build分享 背景介绍 在《流放之路》2.4版本中,贵族类职业的老鹿近战图腾开荒技能Build十分受欢迎。该Build主要通过近战攻击以及使用图腾来造成伤害,适合玩家在团队中担任技能输出的角色。本文将详细讲解该Build的制作过程及使用方法。 制作过程 步骤1:选择适合的职业和技能 在制作老鹿近战图腾的Build前,首先需…

    C# 2023年6月6日
    00
  • FileStream常用的属性与方法总结

    根据你的需求,我会为你详细讲解一下“FileStream常用的属性与方法总结”的攻略。 概述 FileStream是.NET Framework中对文件进行读写操作的一个类,它继承自System.IO.Stream类。FileStream类可以对任何类型的文件进行读写操作,并提供了丰富的属性和方法,方便程序员对文件进行操作。在使用FileStream前,需要…

    C# 2023年6月1日
    00
  • python将图片文件转换成base64编码的方法

    将图片文件转换成base64编码是一种常见的操作,可以将图片文件转换成字符串形式,方便在网络传输中使用。在Python中,我们可以使用base64模块来实现将图片文件转换成base64编码的操作。以下是详细的攻略,包括两个示例。 使用base64模块将图片文件转换成base64编码 要将图片文件转换成base64编码,我们需要使用Python的base64模…

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