2012-02-21 2 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); 

하지만 .... 그러지 마.

+0

니스, 간단하고 깨끗한 작품. 고마워. – user1153896

관련 문제