繁体   English   中英

从不同的来源收听同一事件

[英]Listening to the same Event from different sources

我只是想知道C#/ WPF是否有一个“语法糖化”变体来收听来自不同来源的同一事件。 我为给定事件设置了一个处理程序,并且我想让更多的控件在使用相同处理程序的同时侦听同一事件。

少说话,多代码。 这是我想要实现的目标:

// Presuming pEnable is a parameter, a simple bool
if (pEnable) SomeControl.MouseDown += MyMouseDownEventHandler
        else SomeControl.MouseDown -= MyMouseEventHandler;

// How can I avoid repeating the snippet from above?
// E.g. Do the same for SomeOtherControl, ThisOtherControl and so on

整个三元运算符都可以解决,我只想发布我正在考虑的整个代码片段。 如果它们看起来很粗略,我可以提供其他任何细节。

提前致谢!

更新:

事实证明,由于我绑定到一个错误事件,因此在我的情况下,提出的解决方案(见下文) TreeView 。在TreeView的情况下,这应该是PreviewMouseDownEvent ,而不是简单的MouseDown事件。

除此之外,通过使用RoutedEvent这里概述),还可以使用AddHandlerRemoveHandler 有关此问题的更多信息。 再次感谢您的输入!

您能否将其重构为以控件为参数的方法?

void Listen(UIElement element)
{
    if (pEnable) element.MouseDown += MyMouseDownEventHandler
            else element.MouseDown -= MyMouseEventHandler;
}

同样,这些事件路由事件 ,您可以在一个共同祖先上处理该事件,然后查看事件的根源是如何采取相应措施。

由于您使用的是WPF,因此最好的办法是对这些事件使用MVVM样式绑定,然后将XAML中的MouseDown事件绑定到相应视图模型上的相同方法。 这将使您可以从背后的代码中删除所有这些代码,并利用WPF的丰富绑定上下文。

然后,您可以进一步走一步,对共享相同事件实现的控件进行模板化,从而不必在整个XAML中重复所有绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM