1

我收集了 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 的 Merge 功能)不正确。但是,在循环内订阅可以完美运行。

任何人都可以在这里帮助我,如何将多个事件流聚合为一个具有反应性扩展的事件流?

谢谢

4

1 回答 1

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). this 的返回类型是一个结果 observable。我想你可能一直认为 Merge 修改了 Observable,但你可以认为 Observables 是不可变的(有点)。让你的工作方法的方法是:

_allEvents = _allEvents.Merge(seq);

但是……糟糕。不要那样做。

于 2012-02-21T21:41:07.100 回答