2012-02-21 4 views
1

私はINotifyPropertyChangedオブジェクトのコレクションを持っており、すべてのPropertyChangedイベントを単一の観測可能なシーケンスにストリームして処理します。ここでコレクションから1つのIObservableにPropertyChangedイベントを集約します。<EventPattern <PropertyChangedEventArgs >>

はコード

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のマージ機能を使用して集計したように見えます。しかし、ループ内で購読することは完全に機能します。

多くのイベントストリームをリアクティブエクステンションを持つものに集約する方法は誰でも助けてくれますか?

おかげ

答えて

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を修正したと思っていたかもしれないと思うかもしれませんが、Observablesは不変のものと考えることができます。あなたのアプローチを働かせる方法は、次のようになりました。

_allEvents = _allEvents.Merge(seq); 

しかし、... yuck。それをしないでください。

+0

ニース、シンプル、クリーン、作品。どうもありがとう – user1153896