• 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( 11 , "token_1" );
    //WeakReferenceMessenger.Default.Send( true , "token_1" );
    //上面这样也是可以的,但是官方推荐用ValueChangedMessage封装数据传递
    WeakReferenceMessenger.Default.Sendstring> , string>( new ValueChangedMessage<string>( "UserControlLeftViewModel发来的qq1" ) , "token_1" );

    建议发送消息时都带上token名称,这样方便订阅接收方过滤数据 

    WeakReferenceMessenger.Default.Sendstring> , 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 , string>( new ValueChangedMessage( _data1 ) , "token_class" );

     

    发送消息并有返回响应值

    ///
    /// 必须继承RequestMessage RequestMessage代表返回数据的类型是string
    ///
    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.Sendstring>( _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.Registerstring>( this , ( r , message ) =>
    {
    Name = Name + " 收到msg:" + message;
    } );
    //Register<>第一个类型一般是自己的类型,第2个是接收数据的类型,第3个是token数据的类型
    //Register方法第1个参数一般是this,第2个参数是token,第3个参数是一个方法,可以获取接收到的值
    //Messenger.Register( this , "token_1" , ( r , message ) =>
    //{
    // Name = Name + " 收到msg:" + message;
    //} );
    //ValueChangedMessage
    Messenger.Registerstring> , string>( this , "token_1" , ( r , message ) =>
    {
    Name = Name + " 收到msg:" + message.Value;
    } );
    //Messenger.Register( this , "token_class" , ( r , user ) =>
    //{
    // Name = Name + " 收到msg:" + user.UserName + user.Age;
    //} );
    Messenger.Register , string>( this , "token_class" , ( r , user ) =>
    {
    Name = Name + " 收到msg:" + user.Value.UserName + user.Value.Age;
    } );
    Messenger.Registerstring>( this , "token_Response" , ( r , message ) =>
    {
    Name = Name + " 收到msg:" + message.Datas;
    //Reply是答复 ,这样可以返回值
    message.Reply( "UserControlTopViewModel给你返回值" );
    } );
    }

     

    自我Demo地址:

    https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6/MessengerDemo

     

  • 相关阅读:
    Mybiosource丨Mybiosource兔抗人磷脂酶 A2 多克隆抗体
    redis中集合的相关命令
    万兆以太网MAC设计(8)ICMP协议详解以及ICMP层模块设计
    三十、【进阶】B树的演变过程
    简单工厂,工厂方法,抽象工厂模式
    java设计模式3,里氏替换原则
    2022-10-27 工作记录--Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题
    Vue3:proxy数据取值proxy[Target]取值
    新型基础测绘与实景三维中国建设技术文件【4】基础地理实体数据元数据
    第一个接受素数定理的人
  • 原文地址:https://www.cnblogs.com/aierong/p/17318525.html