RX, загруженное событие - PullRequest
1 голос
/ 16 ноября 2011

Попытка использовать RX с событиями, но это намекает на меня. Это «нормальный» способ подписаться на событие

this.Loaded += new RoutedEventHandler(SelectPartyPersonDataEntry_Loaded); 

Путь RX ....

Observable.FromEventPattern<RoutedEventArgs>(this, "Loaded").Subscribe((routedEvent) => this.Searchbutton_Click(routedEvent.Sender, routedEvent.EventArgs));  

однако, он молча терпит неудачу, и я не уверен почему.

Спасибо!


Я не совсем уверен, как с этим справиться, поскольку оба эти ответа помогли мне понять, в чем я ошибался. Правильный синтаксис (или тот, который работает):

Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(h => this.Loaded += h, h => this.Loaded -= h).Subscribe(routedEvents => SelectPartyPersonDataEntry_Loaded(routedEvents.Sender, routedEvents.EventArgs));

Что выглядит более запутанным, чем что-либо еще. Я должен предоставить как тип EventHandler (RoutedEventHandler), так и тип аргумента события (RoutedEventArgs), чтобы подписаться на события. Использование этой подписи FromEventPattern означает, что мне нужно использовать синтаксис + = / - = для подписки на событие.

Я вижу только одну причину, по которой вы бы сделали это по сравнению с традиционным (и более лаконичным) синтаксисом, - разницу между сильной ссылкой и слабой ссылкой. Если это представление выходит за пределы области действия, необходимо обеспечить надежную ссылку, чтобы представление было собрано (GC). Синтаксис RX является слабой ссылкой, и поэтому он будет GC без разыменования события.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Я подозреваю, что это связано с отсутствием типа аргументов события.Сигнатура метода, которую вы используете:

IObservable<EventPattern<EventArgs>>
    FromEventPattern(object target, string eventName)

Я подозреваю, что вам нужно:

IObservable<EventPattern<TEventArgs>>
    FromEventPattern<TEventArgs>(object target, string eventName)
    where TEventArgs: EventArgs

Еще лучше, не используйте метод «отражения» (т.е. никаких магических строк).Используйте это вместо:

IObservable<EventPattern<TEventArgs>>
    FromEventPattern<TDelegate, TEventArgs>(
        Action<TDelegate> addHandler, Action<TDelegate> removeHandler)
    where TEventArgs: EventArgs
1 голос
/ 16 ноября 2011

Я только что проверил это в приложении WPF:

var loadedEvent = Observable.FromEventPattern(this, "Loaded");
loadedEvent.Subscribe(e => MessageBox.Show("loaded"));

И это работает; окно сообщения показано.

Возможно, вы могли бы уточнить, что вы имеете в виду, когда говорите, что ничего не получается - вы пробовали это в отладчике? Вы уверены, что там есть событие Loaded?

...