MVVMLight のデフォルト メッセンジャー経由で送信されるすべてのメッセージをログに記録したいと考えています。このためには、送信者と受信者に関する情報をデバッグ出力に書き込むラッパー クラスsourceが必要です。
次のラッパー クラスは、送信されたメッセージと送信者の名前をデバッグに正常に記録します。ただし、メッセージの受信を適切に記録しません。メッセージが送信されると、受信者は 1 回ログに記録されます。同じメッセージが再度送信されると、受信者はメッセージを受信しません。
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 インライン デリゲート内の変数を参照しないと、それが機能することを経験しました。
したがって、これは機能します:
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) ) を変更せずに変数アクションと受信者にアクセスするにはどうすればよいですか?