Упрощенный агрегатор событий PRISM - ошибка подписки

У меня проблемы с подпиской на EventAggregator, полный код vb.net приведен ниже.

МОДУЛЬ EventSystem - упрощенная ПРИЗМА из блога Рэйчел, превращенная в VB.net в виде модуля следующим образом:

Imports Prism.Events

Module EventSystem

    Private _current As IEventAggregator

    Public ReadOnly Property Current As IEventAggregator
        Get

#Disable Warning BC40000 ' Type or member is obsolete
            Return If(_current, (CSharpImpl.__Assign(_current, New EventAggregator())))
#Enable Warning BC40000 ' Type or member is obsolete

        End Get
    End Property

    Private Function GetEvent(Of TEvent)() As PubSubEvent(Of TEvent)
        Return Current.GetEvent(Of PubSubEvent(Of TEvent))()
    End Function

    Sub Publish(Of TEvent)()
        Publish(Of TEvent)(Nothing)
    End Sub

    Sub Publish(Of TEvent)(ByVal [event] As TEvent)
        GetEvent(Of TEvent)().Publish([event])
    End Sub

    Function Subscribe(Of TEvent)(ByVal action As Action, ByVal Optional threadOption As ThreadOption = ThreadOption.PublisherThread, ByVal Optional keepSubscriberReferenceAlive As Boolean = False) As SubscriptionToken
        Return Subscribe(Of TEvent)(Sub(e) action(), threadOption, keepSubscriberReferenceAlive)
    End Function

    Function Subscribe(Of TEvent)(ByVal action As Action(Of TEvent), ByVal Optional threadOption As ThreadOption = ThreadOption.PublisherThread, ByVal Optional keepSubscriberReferenceAlive As Boolean = False, ByVal Optional filter As Predicate(Of TEvent) = Nothing) As SubscriptionToken
        Return GetEvent(Of TEvent)().Subscribe(action, threadOption, keepSubscriberReferenceAlive, filter)
    End Function

    Sub Unsubscribe(Of TEvent)(ByVal token As SubscriptionToken)
        GetEvent(Of TEvent)().Unsubscribe(token)
    End Sub

    Sub Unsubscribe(Of TEvent)(ByVal subscriber As Action(Of TEvent))
        GetEvent(Of TEvent)().Unsubscribe(subscriber)
    End Sub

    Private Class CSharpImpl
        <Obsolete("Please refactor calling code to use normal Visual Basic assignment")>
        Shared Function __Assign(Of T)(ByRef target As T, value As T) As T
            target = value
            Return value
        End Function
    End Class

End Module

Я могу "Опубликовать" в "EventSystem" без проблем, код, как следует, где в качестве сообщения используется класс "NewMessage":

EventSystem.Publish(Of NewMessage)(New NewMessage With {.Msg = "Test"})

Проблемы с "Подпиской", код приведен ниже и, к сожалению, не работает:

EventSystem.Subscribe(Of NewMessage)(AppNavigate)

Private Sub AppNavigate(ByVal msg As NewMessage)
        MsgBox(msg.Msg)
End Sub

Ошибка: Аргумент не указан для параметра 'msg' AppNavigate... Это не может понять, класс NewMessage имеет свойство msg. как показано ниже

Public Class NewMessage
    Public Msg As String
End Class

Пожалуйста помоги. Спасибо

1 ответ

Наконец-то нашел решение для VB.NET, может быть кому-нибудь пригодится. Все вышеперечисленное можно использовать для реализации упрощенного агрегатора событий PRISM, "подписка" выполняется следующим образом с использованием лямбда-выражения:

 EventSystem.Subscribe(Of NewMessage)(AppNavigate)

    Private ReadOnly AppNavigate As Action(Of NewMessage) = Sub(ByVal msg As NewMessage)
                                                                   MsgBox(msg.Msg) 
                                                            End Sub
Другие вопросы по тегам