棱镜事件聚合器.接收事件并再次发送



在我的项目中,我有三个ViewModels(例如,ViewModelAViewModelBViewModelC(。
我需要编写以下逻辑。
ViewModelA使用棱镜中的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:这是大项目的一部分。因此,请不要建议在没有ViewModelB的情况下直接从ViewModelA发送到ViewModelC

事件聚合器的工作方式是每个人都可以收听每个事件。因此,如果要从 A 发送到 B(然后从 B 发送到 C(,则需要两个不同的"私人"事件。

一个:

eventAggregator.Publish<AtoB>( value );

乙:

eventAggregator.Subscribe<AtoB>( x => {
var y = process(x);
eventAggregator.Publish<BtoC>( y );
} );

三:

eventAggregator.Subscribe<BtoC>( x => whatever( x ) );

旁注:您发布和订阅的是事件类型,而不是有效负载类型。事件(EventData(的命名有点尴尬,因为人们会将其与有效载荷混淆。一个更好的名字是DataEvent...或者,在这里,RawDataEventProcessedDataEvent.

旁注 2:显然,事件聚合器不适用于非广播消息。您可以强制使用(使用不同的事件类型,或者例如,通过在有效负载中包含目标 ID(,但我更喜欢为点对点消息设计的消息传递系统。

最新更新