為了應用程式的不同模組分離,減少模組之間參照,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