在我的项目中,我有三个ViewModels(例如,ViewModelA
,ViewModelB
和ViewModelC
(。
我需要编写以下逻辑。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
...或者,在这里,RawDataEvent
和ProcessedDataEvent
.
旁注 2:显然,事件聚合器不适用于非广播消息。您可以强制使用(使用不同的事件类型,或者例如,通过在有效负载中包含目标 ID(,但我更喜欢为点对点消息设计的消息传递系统。