翼度科技»论坛 编程开发 .net 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
本系列文章导航 
希望提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:https://www.cnblogs.com/aierong 
说明

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

方法:WeakReferenceMessenger.Default.Send
官方推荐用ValueChangedMessage封装数据传递
  1. //Send发送消息
  2. WeakReferenceMessenger.Default.Send<string>( "qq1" );
  3. //特别注意:直接传递值,只可以是引用类型,值类型不可以编译成功的(例如:下面2句不行)
  4. //WeakReferenceMessenger.Default.Send<int , string>( 11 , "token_1" );
  5. //WeakReferenceMessenger.Default.Send<bool , string>( true  , "token_1" );
  6. //上面这样也是可以的,但是官方推荐用ValueChangedMessage封装数据传递
  7. WeakReferenceMessenger.Default.Send<ValueChangedMessage<string> , string>( new ValueChangedMessage<string>( "UserControlLeftViewModel发来的qq1" ) , "token_1" );
复制代码
建议发送消息时都带上token名称,这样方便订阅接收方过滤数据 
  1. WeakReferenceMessenger.Default.Send<ValueChangedMessage<string> , string>( new ValueChangedMessage<string>( "UserControlLeftViewModel发来的qq1" ) , "token_1" );
复制代码
 

发送消息传递对象
  1.     public class MyUserMessage
  2.     {
  3.         public string UserName
  4.         {
  5.             get; set;
  6.         }
  7.       
  8.         public int Age
  9.         {
  10.             get; set;
  11.         }
  12.     }
复制代码
  1. //Send发送 一个复杂数据
  2. var _data1 = new MyUserMessage() { Age = 18 , UserName = "qq" };
  3.            
  4. WeakReferenceMessenger.Default.Send<ValueChangedMessage<MyUserMessage> , string>( new ValueChangedMessage<MyUserMessage>( _data1 ) , "token_class" );
复制代码
 
发送消息并有返回响应值
  1.     /// <summary>
  2.     /// 必须继承RequestMessage  RequestMessage<string>代表返回数据的类型是string
  3.     /// </summary>
  4.     public class MyMessage : RequestMessage<string>
  5.     {
  6.         public string Datas;
  7.         public int Ids;
  8.     }
复制代码
  1.             //result接收返回的值
  2.             //MyMessage这个类必须继承RequestMessage
  3.             var _data2 = new MyMessage() { Datas = "qqq" , Ids = 100 };
  4.             var result1 = WeakReferenceMessenger.Default.Send<MyMessage , string>( _data2 , "token_Response" );
  5.             if ( result1 != null )
  6.             {
  7.                 //获取到 返回的值
  8.                 var val = result1.Response;
  9.                 Name = val;
  10.             }
复制代码
 
 
接收订阅消息

接收2种方式:
方式1.继承ObservableRecipient  
方式2.实现接口IRecipient
方式1比方式2灵活,推荐使用方式1
 
接收方记得设置IsActive=true,才可以收到消息
我们在vm的OnActivated中接收消息数据
  1.         [ObservableProperty]
  2.         private string name = "hello";
  3.         public UserControlTopViewModel ()
  4.         {
  5.             //注意这样要写,才可以接听
  6.             IsActive = true;
  7.         }
复制代码
  1.         protected override void OnActivated ()
  2.         {
  3.             //Register<>第一个类型一般是自己的类型,第2个是接收数据的类型
  4.             //Register方法第1个参数一般是this,第2个参数是一个方法,可以获取接收到的值
  5.             Messenger.Register<UserControlTopViewModel , string>( this , ( r , message ) =>
  6.             {
  7.                 Name = Name + "  收到msg:" + message;
  8.             } );
  9.             //Register<>第一个类型一般是自己的类型,第2个是接收数据的类型,第3个是token数据的类型
  10.             //Register方法第1个参数一般是this,第2个参数是token,第3个参数是一个方法,可以获取接收到的值
  11.             //Messenger.Register<UserControlTopViewModel , string , string>( this , "token_1" , ( r , message ) =>
  12.             //{
  13.             //    Name = Name + "  收到msg:" + message;
  14.             //} );
  15.             //ValueChangedMessage<string>                  
  16.             Messenger.Register<UserControlTopViewModel , ValueChangedMessage<string> , string>( this , "token_1" , ( r , message ) =>
  17.             {
  18.                 Name = Name + "  收到msg:" + message.Value;
  19.             } );
  20.             //Messenger.Register<UserControlTopViewModel , MyUserMessage , string>( this , "token_class" , ( r , user ) =>
  21.             //{
  22.             //    Name = Name + "  收到msg:" + user.UserName + user.Age;
  23.             //} );
  24.             Messenger.Register<UserControlTopViewModel , ValueChangedMessage<MyUserMessage> , string>( this , "token_class" , ( r , user ) =>
  25.             {
  26.                 Name = Name + "  收到msg:" + user.Value.UserName + user.Value.Age;
  27.             } );
  28.             Messenger.Register<UserControlTopViewModel , MyMessage , string>( this , "token_Response" , ( r , message ) =>
  29.             {
  30.                 Name = Name + "  收到msg:" + message.Datas;
  31.                 //Reply是答复 ,这样可以返回值
  32.                 message.Reply( "UserControlTopViewModel给你返回值" );      
  33.             } );
  34.         }
复制代码
 
自我Demo地址:
https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6/MessengerDemo
 
A.Sql Server2005 Transact-SQL 新兵器学习
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex

希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!


来源:https://www.cnblogs.com/aierong/archive/2023/04/14/17318525.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具