Layer Communication.Messenger
下面的文本在DevExpress的MVVM Best Practices Demo中有一个相关的例子。
Group:API代码示例
Module:Messenger
Example:Messenger
23.1 Demo Center:启动演示
实际应用程序几乎总是有多个视图和视图模型,而且除了极少数例外,您将需要一种方法使这些独立的层相互通信并共享数据。要解决这个问题:请使用DevExpress MVVM Messenger。
这个消息机制的思想非常简单:在Sender ViewModel中,调用Send方法并用消息的形式传输所需的数据,在接收者ViewModel中,调用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之间建立永久连接,这意味着一旦调用Register方法就不需要再次调用,所有发送的后续消息都将被自动接收,要中断此连接,请使用Unregister方法。
C#:
Messenger.Default.Unregister<string>(this, OnStringMessage);
VB.NET:
Messenger.Default.Unregister(Of String)(Me, OnStringMessage)
如果有多个发送方传输相同类型的消息,则可以使用tokens标记从不同发送方发送消息,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方法具有相应的重载,允许您接收或阻止用特定令牌标记的消息。
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)