试图在事件中使用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。
发布于 2011-11-15 21:46:27
我刚刚在一个WPF应用程序中测试了这个:
var loadedEvent = Observable.FromEventPattern(this, "Loaded");
loadedEvent.Subscribe(e => MessageBox.Show("loaded"));它起作用,它显示了消息框。
也许,当你说它失败时,你可以详细说明你的意思--你在调试器中尝试过吗?你确定里面有个重要的事件吗?
发布于 2011-11-15 21:57:02
我怀疑这与不提供事件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: EventArgshttps://stackoverflow.com/questions/8143322
复制相似问题