本系列文章导航

  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

CommunityToolkit.Mvvm8.1 消息通知(4)的更多相关文章

  1. UWP消息通知

    在Windows 10通常是使用Toast通知方式进行的消息通知,但是在应用通知是不需要通知带有音效的,但是又不能在系统通知中心留下记录,那么需要监听ToastNotification实例的Dismi ...

  2. Redis系列二之事务及消息通知

    一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...

  3. Redis笔记(六)Redis的消息通知

    Redis的消息通知可以使用List类型的LPUSH和RPOP(左进右出),当然更方便的是直接使用Redis的Pub/Sub(发布/订阅)模式. >>使用List实现队列 使用列表类型的L ...

  4. 使用 Windows10 自定义交互消息通知

    消息通知是最常用的应用功能之一了,但是由于平台的差异,IOS Android 以及 Windows 都有其特殊性,Android开发者在国内常常都是使用三方的一些推送服务,或者是使用自建的服务器为应用 ...

  5. Android中的消息通知(NotificationManager和Notification)

    下面来谈谈notification,这个notification一般用在电话,短 信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这 ...

  6. Android消息通知(notification)和PendingIntent传值

    通知栏的自定义布局:转:http://blog.csdn.net/vipzjyno1/article/details/25248021 拓展 实现自定义的通知栏效果: 这里要用到RemoteViews ...

  7. cordova的android notify消息通知插件

    最近在学习用CORDOVA(PHONEGAP)结合SENCHA TOUCH开发应用,想实现一个安卓下的消息通知功能,这个可以通过CORDOVA的插件来实现. 插件目录结构如下: notifyplugi ...

  8. Unity3D研究院之IOS本地消息通知LocalNotification的使用

    原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器 ...

  9. HTML 5的消息通知机制

    译文来源:http://www.ido321.com/1130.html 原文:HTML 5 Notification 译文:HTML 5 的消息通知机制 译者:dwqs HTML 5 已经被应用到W ...

  10. iOS8新特性之基于地理位置的消息通知UILocalNotification

              苹果在WWDC2014上正式公布了全新的iOS8操作系统. 界面上iOS8与iOS7相比变化不大,只是在功能方面进行了完好.                             ...

随机推荐

  1. Day1.无敌难受且成功

    Markdown学习 标题 字体 ctrl+b.l.u.k加粗.斜体.下划线.超链接 引用 大于号+空格 分割线 三个*** ###都 图片 !+[]+() 英文输入法的符号 输入的图片路径可本地也要 ...

  2. 05 HDFS Java API应用实例

    一.在Ubuntu系统中安装和配置Eclipse 二.利用hadoop 的java api,向HDFS写一个文件. 三.从HDFS读取一个文件的内容.

  3. CF1272 B DIV3 ---代码对比

    这次DIV3有点可惜啊,题解是我的与学长的代码对比 学长的原博客https://www.cnblogs.com/xyq0220/p/12036109.html B.Snow Walking Robot ...

  4. 关于数据传递 json

    关于这几种语言的json 操作 Lua local cjson2 = require "cjson" local lua_object = { ["name"] ...

  5. django_模板层的变量和标签

    一.模板层的变量 1.能传递到模板层的数据类型:str(字符串).list(数组).dict(字典).obj(类实例化的对象).fun(函数)等. 2.在模板中使用变量的方法: (1)字符串:{{ 变 ...

  6. SQL 2019 卸载方法

    一.关闭服务 1.  win+r      services.msc   打开服务,关闭与SQL有关的服务内容. 二.卸载应用 1.win+r  control   打开控制面板---卸载程序---卸 ...

  7. windows下使用Wireshark调试chrome浏览器的HTTP/2流量

    1.在Wireshark官网(https://www.wireshark.org/#download)下载对应的Wireshark安装包,进行安装 2.增加系统环境变量设置(计算机 -- 右键 -- ...

  8. MySQL学习(三)DQL/DML/DDL/DCL 介绍

    参考博客:https://blog.csdn.net/tomatofly/article/details/5949070 DQL(data query language) :数据查询语言 select ...

  9. Linux & 标准C语言学习 <DAY6>

    一.数组     什么是数组:变量的组合,是一种批量定义相同类型变量的方式     定义:  类型名 数组名[数量];             int arr[5];             注意:数 ...

  10. 在Winform分页控件中集成导出PDF文档的功能

    当前的Winform分页控件中,当前导出的数据一般使用Excel来处理,Excel的文档可以用于后期的数据展示或者批量导入做准备,因此是比较好的输入输出格式.但是有框架的使用客户希望分页控件能够直接导 ...