本系列文章導航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知識對您有所提示,同時歡迎交流和指正 作者:aierong出處:https://www ...
說明
為了應用程式的不同模塊分離,減少模塊之間引用,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
我的系列文章
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
貼子以"現狀"提供且沒有任何擔保,同時也沒有授予任何權利!
本文版權歸作者所有,歡迎轉載!
原創技術文章和心得,轉載註明出處!這也是對原創者的尊重!