尝试将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而不取消引用该事件。
答案 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