我有INotifyPropertyChanged对象的集合,并希望将所有PropertyChanged事件流式传输到单个可观察序列中以供进一步处理。
这是一个代码
IObservable<EventPattern<PropertyChangedEventArgs>> _allEvents = null;
// Items contains collection of item, which implements INotifyPropertyChanged
foreach (var item in Items)
{
var seq = Observable.FromEventPattern<PropertyChangedEventArgs>(item, "PropertyChanged");
if (_allEvents == null)
_allEvents = seq;
else
_allEvents.Merge(seq);
}
// subscribe to the aggregated observable sequence
if (_allEvents != null)
_allEvents.Subscribe(evt => Trace.WriteLine(" Property Changed -> " + evt.EventArgs.PropertyName));
单个订阅在聚合序列中由于某种原因不起作用。 看起来我错误地汇总了(使用Reactive Extensions&#39;合并功能)。但是,在循环中订阅可以很好地工作。
有人可以在这里帮助我,如何将多个事件流聚合成一个带有被动扩展的事件流?
由于
答案 0 :(得分:1)
试试这个:
var _allEvents = Observable
.Merge(Items
.Select(item => Observable
.FromEventPattern<PropertyChangedEventArgs>(item, "PropertyChanged")));
_allEvents.Subscribe(evt => Trace.WriteLine(" Property Changed -> " + evt.EventArgs.PropertyName));
您的方法不起作用的原因是您正在调用IObservable<T> Observable.Merge<T>(this IObservable<T> first, IObservable<T> second)
。返回类型是一个可观察的结果。我想你可能一直认为Merge修改了Observable,但你可以把Observable视为不可变的(有点)。让你的工作方法的方法是:
_allEvents = _allEvents.Merge(seq);
但是......哎呀。不要那样做。