我想记录通过MVVMLight默认信使发送的所有消息。 为此,我需要一个包装类source,它将有关发送方和接收方的信息写入调试输出。
以下包装类成功将已发送消息和发件人名称记录到调试中。 但是它没有正确记录接收消息: 发送邮件时,收件人会被记录一次。 再次发送相同的消息时,收件人将不会收到该消息。
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光信使:
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作为TMessage))?