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#多线程的ResetAbort()方法

    下面是关于C#多线程中ResetAbort()方法的详细讲解: ResetAbort()方法简介 ResetAbort()是多线程中的一个方法,它用于取消挂起的线程并重置线程的中止状态。当我们使用Abort()方法中止一个线程时,如果无法中止该线程,则该线程将被挂起,并且它的中止状态将被设置为一个标志,表示该线程已经被中止。此时,我们可以使用ResetAbo…

    C# 2023年5月15日
    00
  • PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    下面我会给您详细讲解 “PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用”的完整攻略。 一、什么是“重构”、“简化函数调用”的概念? 重构是指对既有代码进行修改,以改善其结构,使得代码更易于理解、更容易扩展、更符合设计模式等目的。 而简化函数调用,则是指通过改进函数的接口和参数列表,使得函数调用更为简洁、清晰可读。 二、如何进行函数调用的简化? 在…

    C# 2023年6月6日
    00
  • C#用Topshelf创建Windows服务的步骤分享

    当我们想要在Windows系统上运行某一个程序时,我们通常会使用Windows服务。在C#语言中,我们可以使用Topshelf库快速地创建和管理Windows服务。下面是使用Topshelf库创建Windows服务的步骤: 步骤1:创建一个控制台程序 首先需要创建一个新的C#控制台项目。在Visual Studio中,选择“新建项目”并选择“控制台应用程序”…

    C# 2023年5月15日
    00
  • C#实现的24点游戏实例详解

    C#实现的24点游戏实例详解 介绍 C#实现的24点游戏是一款运用纸牌来进行加减乘除的小游戏,主要目的是让玩家通过选择纸牌,使用加减乘除等运算,得到24这个数。本篇攻略将详细讲解如何实现这个小游戏。 代码实现 代码结构 在开始编写代码前,我们需要先了解一下这个小游戏的框架。C#实现的24点游戏包含三个主要部分:纸牌、答案计算以及游戏流程控制。我们需要将这些部…

    C# 2023年6月7日
    00
  • c# 死锁和活锁的发生及避免

    C# 死锁和活锁的发生及避免攻略 什么是死锁和活锁 死锁和活锁都是多线程并发编程中经常遇到的问题。 死锁 死锁指的是两个或更多的线程被永久地阻塞,无法继续执行,因为每个线程都在等待其他线程释放资源。简单来说,就是线程之间互相占用对方需要的资源,并不释放,而导致程序无限等待下去。 活锁 活锁指的是线程虽然没有被阻塞,但是他们却无法继续前进,因为它们总是在响应其…

    C# 2023年6月7日
    00
  • 解析Asp.net,C# 纯数字加密解密字符串的应用

    解析Asp.net,C#纯数字加密解密字符串的应用 在Asp.net应用中,经常需要对用户输入的敏感信息进行加密,以保证信息的安全性。本篇文章将详细解释如何使用C#进行纯数字加密解密字符串,并提供两个实际的示例,展示该方法的具体应用。 加密算法介绍 在C#中,我们可以使用简单的加法和异或运算来加密一个字符串,如下所示: public static strin…

    C# 2023年6月3日
    00
  • 关于ObservableCollection的更新与不更新分析

    因为最近在WPF项目中,遇到ObservableCollection这个属性的频繁使用,一个一个坑跳过来,今天看到这个贴子 玩转INotifyPropertyChanged和ObservableCollection – 包建强 – 博客园 (cnblogs.com) 其中分析很透彻了,但是留了一点遗憾,而且在其中引起了一个想法,做一个项目来测试一下。 我们知…

    C# 2023年5月7日
    00
  • C#影院售票系统毕业设计(4)

    C#影院售票系统毕业设计(4)详细攻略: 需求分析与实现设计 在需求分析中,我们确定了本系统的主要功能:用户注册登录、电影列表、选座购票、订单管理、影院信息查询等。 接着,我们需要对这些功能进行实现设计,可以采用 MVC (Model-View-Controller)架构。 其中,Model负责数据处理、View负责用户界面,Controller负责用户交互…

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