4

我想记录通过 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接收者

4

0 回答 0