RX,Loaded事件

时间:2011-11-15 21:23:49

标签: system.reactive

尝试将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的这个签名意味着我必须使用订阅该事件的+ = / - =语法。

我只看到一个原因,你可以在传统(更简洁)的语法上做到这一点 - 强引用和弱引用之间的区别。如果此视图超出范围,则必须确保强引用,以便视图可以收集garbadge(GC)。 RX语法是一个弱引用,因此将是GC而不取消引用该事件。

2 个答案:

答案 0 :(得分:1)

我刚在WPF应用中测试了这个:

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

它有效;消息框显示。

也许当你说它无声地失败时你可以详细说明你的意思 - 你是否在调试器中尝试过这个?你确定那里有一个Loaded事件吗?

答案 1 :(得分:1)

我怀疑它与不提供事件args的类型有关。您正在使用的方法签名是:

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