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

2023-04-14 18:02:55
本系列文章導航
  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