首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RX,加载事件

RX,加载事件
EN

Stack Overflow用户
提问于 2011-11-15 21:23:49
回答 2查看 836关注 0票数 1

试图在事件中使用RX,但这一次暗示了我。这是订阅事件的“正常”方式。

代码语言:javascript
复制
this.Loaded += new RoutedEventHandler(SelectPartyPersonDataEntry_Loaded); 

RX方式..。

代码语言:javascript
复制
Observable.FromEventPattern<RoutedEventArgs>(this, "Loaded").Subscribe((routedEvent) => this.Searchbutton_Click(routedEvent.Sender, routedEvent.EventArgs));  

但是,它默默地失败了,我不知道为什么。

谢谢!

我不太清楚该如何处理这件事,因为这两个答案都帮助我理解了我在这件事上出了什么问题。正确的语法(或有效的语法是):

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

发布于 2011-11-15 21:46:27

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

代码语言:javascript
复制
var loadedEvent = Observable.FromEventPattern(this, "Loaded");
loadedEvent.Subscribe(e => MessageBox.Show("loaded"));

它起作用,它显示了消息框。

也许,当你说它失败时,你可以详细说明你的意思--你在调试器中尝试过吗?你确定里面有个重要的事件吗?

票数 3
EN

Stack Overflow用户

发布于 2011-11-15 21:57:02

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

代码语言:javascript
复制
IObservable<EventPattern<EventArgs>>
    FromEventPattern(object target, string eventName)

我怀疑你需要:

代码语言:javascript
复制
IObservable<EventPattern<TEventArgs>>
    FromEventPattern<TEventArgs>(object target, string eventName)
    where TEventArgs: EventArgs

更好的是,不要使用“反射”方法(即没有魔法字符串)。用这个代替:

代码语言:javascript
复制
IObservable<EventPattern<TEventArgs>>
    FromEventPattern<TDelegate, TEventArgs>(
        Action<TDelegate> addHandler, Action<TDelegate> removeHandler)
    where TEventArgs: EventArgs
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8143322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档