Объедините события PropertyChanged из коллекции в один IObservable <EventPattern <PropertyChangedEventArgs>> - PullRequest
1 голос
/ 21 февраля 2012

У меня есть коллекция объектов 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) неправильно.Но подписка внутри цикла работает отлично.

Кто-нибудь может мне помочь, как объединить множество потоков событий в один с реактивными расширениями?

Спасибо

1 Ответ

1 голос
/ 22 февраля 2012

Попробуйте это:

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, но вы можете думать о Observable как о неизменных (вроде). Способ получить ваш подход к работе был бы:

_allEvents = _allEvents.Merge(seq);

Но ... тьфу. Не делай этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...