CommunityToolkit.Mvvm8.1 消息通知(4)
本系列文章导航
说明
为了应用程序的不同模块分离,减少模块之间引用,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)的更多相关文章
- UWP消息通知
在Windows 10通常是使用Toast通知方式进行的消息通知,但是在应用通知是不需要通知带有音效的,但是又不能在系统通知中心留下记录,那么需要监听ToastNotification实例的Dismi ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- Redis笔记(六)Redis的消息通知
Redis的消息通知可以使用List类型的LPUSH和RPOP(左进右出),当然更方便的是直接使用Redis的Pub/Sub(发布/订阅)模式. >>使用List实现队列 使用列表类型的L ...
- 使用 Windows10 自定义交互消息通知
消息通知是最常用的应用功能之一了,但是由于平台的差异,IOS Android 以及 Windows 都有其特殊性,Android开发者在国内常常都是使用三方的一些推送服务,或者是使用自建的服务器为应用 ...
- Android中的消息通知(NotificationManager和Notification)
下面来谈谈notification,这个notification一般用在电话,短 信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这 ...
- Android消息通知(notification)和PendingIntent传值
通知栏的自定义布局:转:http://blog.csdn.net/vipzjyno1/article/details/25248021 拓展 实现自定义的通知栏效果: 这里要用到RemoteViews ...
- cordova的android notify消息通知插件
最近在学习用CORDOVA(PHONEGAP)结合SENCHA TOUCH开发应用,想实现一个安卓下的消息通知功能,这个可以通过CORDOVA的插件来实现. 插件目录结构如下: notifyplugi ...
- Unity3D研究院之IOS本地消息通知LocalNotification的使用
原地址:http://www.xuanyusong.com/archives/2632 现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器 ...
- HTML 5的消息通知机制
译文来源:http://www.ido321.com/1130.html 原文:HTML 5 Notification 译文:HTML 5 的消息通知机制 译者:dwqs HTML 5 已经被应用到W ...
- iOS8新特性之基于地理位置的消息通知UILocalNotification
苹果在WWDC2014上正式公布了全新的iOS8操作系统. 界面上iOS8与iOS7相比变化不大,只是在功能方面进行了完好. ...
随机推荐
- idea中ueditor的入门
首先在https://github.com/fex-team/ueditor下载ueditor1_4_3_3-utf8-jsp.zip:解压去掉里边jsp中的bin目录放到项目中的webapp中: 添 ...
- 12.6linux学习第十三天
今天老刘开始讲第9第章使用ssh服务管理远程主机.第10章开了个小头. 9.1 配置网卡服务 9.1.1 配置网卡参数 截至目前,大家已经完全可以利用当前所学的知识来管理Linux系统了.当然,大家的 ...
- elasticsearch第一天
启动 elasticsearch -d不能用以root用户启动 外网可访问在elasticsearch.yml中添加配置http.host: 0.0.0.0network.host: 0.0.0.0d ...
- hdu:最大点权(强连通分量kosaraju)
Problem Description给定一个有向图,每个点ii有点权a_iai,请对于每个点ii,找到ii能到达的点中点权的最大值(包括ii点). Input第一行包含一个正整数T(1\leq ...
- java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:解决办法
激动的心,颤抖的手.本来web项目数据库连接的好好地,突然就连不上了,一直报java.sql.SQLException: No suitable driver found for jdbc:mysql ...
- [Vue warn]: Duplicate keys detected: ''. This may cause an update error. found in
原因: 使用element-ui 导致 使用路由模式之后 index 没写 导致 解决办法: 删掉 或者天添加路由
- 2020.6.6OO学期末总结
0.前言 本次博客是对整个java及oo学习情况的一个概略性总结,目的在于反思这半年来的学习情况和实际感受,和具体学习方面的理解和问题. 1.作业过程总结 看着自己一个学期做的所有作业,我想起的是总是 ...
- Spring AOP的动态代理原理和XML与注解配置
AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强. 相关术语: Target(目标对象):代理的目标对象 Pr ...
- Vue-router 中hash模式和history模式的关系
Vue-router 中hash模式和history模式的关系 众所周知,vue+vue-router能够构建一个SPA单页面应用, 打包后只会生成一个index.html文件,而项目内页面的切换其实 ...
- (Linux)不挂断启动进程
环境:腾讯云Ubuntu x86_64 问题:在配置应用时,需要让他后台启动,关闭ssh连接也要可以保持后台运行 解决办法: 1.使用nohup 参考链接:https://zhuanlan.zhihu ...