2012-02-21 37 views
1

我有INotifyPropertyChanged對象的集合,並希望將所有PropertyChanged事件流化爲單個可觀察序列以供進一步處理。將集合中的PropertyChanged事件集合到一個IObservable中<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); 

但是... y。不要這樣做。

+0

好,簡單,乾淨,有效。非常感謝 – user1153896 2012-02-22 07:29:42

相關問題