棱镜事件聚合器。接收事件并再次发送
Prism EventAggregator. Receive the event and send it again
在我的项目中,我有三个 ViewModel(例如,ViewModelA
、ViewModelB
和 ViewModelC
)。
我需要编写如下逻辑。
ViewModelA
使用来自 Prism 的 EventAggregator
将值发送到 ViewModelB
。
ViewModelB
接收值并将其发送到 ViewModelC
.
ViewModelC
接收值并做某事。
代码如下:
// The data that will be send using the event aggregator.
class EventData : PubSubEvent<int>
{
}
class ViewModelA
{
IEventAggregator m_eventAggregator;
public ViewModelA(IEventAggregator eventAggregator)
{
m_eventAggregator = eventAggregator;
// Publish some value.
eventAggregator.GetEvent<EventData>().Publish(10);
}
}
class ViewModelB
{
IEventAggregator m_eventAggregator;
public ViewModelB(IEventAggregator eventAggregator)
{
m_eventAggregator = eventAggregator;
eventAggregator.GetEvent<EventData>().Subscribe(OnDataReceived);
}
void OnDataReceived(int value)
{
// Here I want to send the value to the ViewModelC. How can I do it?
}
}
PS:是大项目的一部分。所以,请不要直接从 ViewModelA
发送到 ViewModelC
,没有 ViewModelB
.
事件聚合器的工作方式是每个人都可以收听每个事件。所以,如果你想从 A 发送到 B(然后从 B 到 C),你需要两个不同的 "private" 事件。
甲:
eventAggregator.Publish<AtoB>( value );
乙:
eventAggregator.Subscribe<AtoB>( x => {
var y = process(x);
eventAggregator.Publish<BtoC>( y );
} );
C:
eventAggregator.Subscribe<BtoC>( x => whatever( x ) );
旁注:您发布和订阅的是事件类型,而不是负载类型。您的事件 (EventData
) 的命名有点尴尬,因为人们会将它与有效载荷混淆。更好的名称是 DataEvent
... 或者,这里是 RawDataEvent
和 ProcessedDataEvent
.
旁注 2:显然,事件聚合器不适用于非广播消息。您可以强制执行它(使用不同的事件类型,或者,例如,通过在有效负载中包含目标 ID),但我更喜欢专为点对点消息设计的消息传递系统。
在我的项目中,我有三个 ViewModel(例如,ViewModelA
、ViewModelB
和 ViewModelC
)。
我需要编写如下逻辑。
ViewModelA
使用来自 Prism 的 EventAggregator
将值发送到 ViewModelB
。
ViewModelB
接收值并将其发送到 ViewModelC
.
ViewModelC
接收值并做某事。
代码如下:
// The data that will be send using the event aggregator.
class EventData : PubSubEvent<int>
{
}
class ViewModelA
{
IEventAggregator m_eventAggregator;
public ViewModelA(IEventAggregator eventAggregator)
{
m_eventAggregator = eventAggregator;
// Publish some value.
eventAggregator.GetEvent<EventData>().Publish(10);
}
}
class ViewModelB
{
IEventAggregator m_eventAggregator;
public ViewModelB(IEventAggregator eventAggregator)
{
m_eventAggregator = eventAggregator;
eventAggregator.GetEvent<EventData>().Subscribe(OnDataReceived);
}
void OnDataReceived(int value)
{
// Here I want to send the value to the ViewModelC. How can I do it?
}
}
PS:是大项目的一部分。所以,请不要直接从 ViewModelA
发送到 ViewModelC
,没有 ViewModelB
.
事件聚合器的工作方式是每个人都可以收听每个事件。所以,如果你想从 A 发送到 B(然后从 B 到 C),你需要两个不同的 "private" 事件。
甲:
eventAggregator.Publish<AtoB>( value );
乙:
eventAggregator.Subscribe<AtoB>( x => {
var y = process(x);
eventAggregator.Publish<BtoC>( y );
} );
C:
eventAggregator.Subscribe<BtoC>( x => whatever( x ) );
旁注:您发布和订阅的是事件类型,而不是负载类型。您的事件 (EventData
) 的命名有点尴尬,因为人们会将它与有效载荷混淆。更好的名称是 DataEvent
... 或者,这里是 RawDataEvent
和 ProcessedDataEvent
.
旁注 2:显然,事件聚合器不适用于非广播消息。您可以强制执行它(使用不同的事件类型,或者,例如,通过在有效负载中包含目标 ID),但我更喜欢专为点对点消息设计的消息传递系统。