Layer Communication.Messenger
下面的文本在DevExpress的MVVM Best Practices Demo中有一個相關(guān)的例子。
Group:API代碼示例
Module:Messenger
Example:Messenger
23.1 Demo Center:啟動演示
實(shí)際應(yīng)用程序幾乎總是有多個視圖和視圖模型,而且除了極少數(shù)例外,您將需要一種方法使這些獨(dú)立的層相互通信并共享數(shù)據(jù)。要解決這個問題:請使用DevExpress MVVM Messenger。
這個消息機(jī)制的思想非常簡單:在Sender ViewModel中,調(diào)用Send方法并用消息的形式傳輸所需的數(shù)據(jù),在接收者ViewModel中,調(diào)用Register方法來捕獲所有消息。
C#:
//sender public void SendCustomMessage() { Messenger.Default.Send("A message"); } //receiver public void RegisterAsStringMessageRecepient() { Messenger.Default.Register<string>(this, OnStringMessage); } void OnStringMessage(string message){ //custom action }
VB.NET:
'sender Public Sub SendCustomMessage() Messenger.Default.Send("A message") End Sub 'receiver Public Sub RegisterAsStringMessageRecepient() Messenger.Default.Register(Of String)(Me, AddressOf OnStringMessage) End Sub Private Sub OnStringMessage(ByVal message As String) 'custom action End Sub
Register方法在ViewModels之間建立永久連接,這意味著一旦調(diào)用Register方法就不需要再次調(diào)用,所有發(fā)送的后續(xù)消息都將被自動接收,要中斷此連接,請使用Unregister方法。
C#:
Messenger.Default.Unregister<string>(this, OnStringMessage);
VB.NET:
Messenger.Default.Unregister(Of String)(Me, OnStringMessage)
如果有多個發(fā)送方傳輸相同類型的消息,則可以使用tokens標(biāo)記從不同發(fā)送方發(fā)送消息,tokens可以是任何類型的對象,下面的代碼使用簡單的字符串令牌。
C#
public void TransmitMessage1() { Messenger.Default.Send<string>("This message is sent from Sender 1", "sender1"); } public void TransmitMessage2() { Messenger.Default.Send<string>("This message is sent from Sender 2", "sender2"); }
VB.NET:
Public Sub TransmitMessage1() Messenger.Default.Send(Of String)("This message is sent from Sender 1", "sender1") End Sub Public Sub TransmitMessage2() Messenger.Default.Send(Of String)("This message is sent from Sender 2", "sender2") End Sub
Register和Unregister方法具有相應(yīng)的重載,允許您接收或阻止用特定令牌標(biāo)記的消息。
C#:
Messenger.Default.Register<string>(this, "sender1", OnStringMessage); Messenger.Default.Unregister<string>(this, "sender2", OnStringMessage);
VB.NET:
Messenger.Default.Register(Of String)(Me, "sender1", OnStringMessage) Messenger.Default.Unregister(Of String)(Me, "sender2", OnStringMessage)