我想记录通过 MVVMLight 默认信使发送的所有消息。为此,我需要一个包装类源,它将有关发送者和接收者的信息写入调试输出。
以下包装类成功地将发送的消息和发送者的名称记录到调试中。但是,它不会正确记录接收消息:发送消息时,会记录一次收件人。当再次发送相同的消息时,收件人将不会收到该消息。
Imports GalaSoft.MvvmLight.Messaging
Public Class MonitoringMessenger
Public Shared Sub Send(Of TMessage)(message As TMessage, sender As Object)
Debug.WriteLine(sender.GetType.Name & "(" & sender.GetHashCode() & ") sended " & GetType(TMessage).Name)
Messenger.Default.Send(Of TMessage)(message)
End Sub
Public Shared Sub Register(Of TMessage)(ByVal recipient As Object, action As Action(Of TMessage))
Dim monitoredAction As Action(Of TMessage) = Sub(msg As TMessage)
action.Invoke(msg)
Debug.WriteLine(recipient.GetType.Name & "(" & recipient.GetHashCode() & ") received " & GetType(TMessage).Name)
End Sub
Messenger.Default.Register(Of TMessage)(recipient, monitoredAction)
End Sub
End Class
我把它称为真正的 mvvm light messenger:
MonitoringMessenger.Register(Of TextMessage)(Me, AddressOf OnTextMessageReceived)
并发送:
MonitoringMessenger.Send(Of TextMessage)(New TextMessage(Me.InputTextBox.Text), Me)
所以我的问题是,我的通用代码有什么问题?为什么一条消息只收到一次,然后就再也没有了?
我已经测试了一个非通用版本,它工作正常。但这很不方便,因为我有很多消息类型。
编辑: 我经历过,当我不引用monitoredAction inline-delegate 中的任何变量时,它就会起作用。
所以这有效:
Public Shared Sub Register(Of TMessage)(ByVal recipient As Object, action As Action(Of TMessage))
Dim monitoredAction As Action(Of TMessage) = Sub(msg As TMessage)
Debug.WriteLine("monitoredAction called")
End Sub
Messenger.Default.Register(Of TMessage)(recipient, monitoredAction)
End Sub
如何在不更改委托签名(Sub(msg As TMessage) )的情况下访问变量action和接收者?