【问题标题】:Aggregate PropertyChanged events from the collection into one IObservable<EventPattern<PropertyChangedEventArgs>>将集合中的 PropertyChanged 事件聚合到一个 IObservable<EventPattern<PropertyChangedEventArgs>>
【发布时间】:2012-02-22 05:41:07
【问题描述】:

我收集了 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 功能)不正确。但是,在循环内订阅效果很好。

谁能在这里帮助我,如何通过响应式扩展将多个事件流聚合成一个?

谢谢

【问题讨论】:

    标签: system.reactive reactive-programming reactiveui


    【解决方案1】:

    试试这个:

    var _allEvents = Observable
       .Merge(Items
           .Select(item => Observable
               .FromEventPattern<PropertyChangedEventArgs>(item, "PropertyChanged")));
    
    _allEvents.Subscribe(evt => Trace.WriteLine(" Property Changed -> " + evt.EventArgs.PropertyName));
    

    你的方法不起作用的原因是你打电话给IObservable&lt;T&gt; Observable.Merge&lt;T&gt;(this IObservable&lt;T&gt; first, IObservable&lt;T&gt; second)。 this 的返回类型是一个结果 observable。我想你可能一直认为 Merge 修改了 Observable,但你可以认为 Observables 是不可变的(有点)。让你的工作方法是:

    _allEvents = _allEvents.Merge(seq);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 2014-01-25
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多