prism - 简化的 PRISM 事件聚合器 - 订阅错误
问题描述
我在订阅 EventAggregator 时遇到困难,完整的 vb.net 代码如下。
'EventSystem' MODULE - 来自 Rachel 博客的简化 PRISM,转为 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
错误:未为 AppNavigate 的参数“msg”指定参数...这无法理解,类 NewMessage 具有属性 msg。如下
Public Class NewMessage
Public Msg As String
End Class
请帮忙。谢谢
解决方案
终于找到了 VB.NET 的解决方案,也许对某人有用。以上所有内容都可用于实现简化的 PRISM 事件聚合器,使用 lambda 表达式按如下方式执行“订阅”:
EventSystem.Subscribe(Of NewMessage)(AppNavigate)
Private ReadOnly AppNavigate As Action(Of NewMessage) = Sub(ByVal msg As NewMessage)
MsgBox(msg.Msg)
End Sub
推荐阅读
- r - 在 shiny::renderPlot 中更改宽度参数的默认值
- android - MPAndroidChart 折线图图表消失
- linux - 如何在所有目录中 gzip 某些扩展?
- c# - 为什么我的上下文在我可以使用之前就被处理掉了?
- python-3.x - 使用 BFS 打印覆盖无向无权图中所有边的最短路径 - Python
- pandas - 一种测量时间序列数据帧平滑度的方法
- node.js - 原始查询中的 Node JS Sequelize WHERE LIKE 运算符抛出错误
- swift - 发生状态更改时 UISegmentedControl 不更改
- android - android ListView 类中 clearChoices 方法的替代方法
- javascript - TypeError:无法读取未定义的属性“未定义” - 将数据映射到卡上并呈现到菜单上