从不同来源收听同一事件

本文关键字:事件 | 更新日期: 2023-09-27 18:22:13

我只是想知道C#/WPF是否有一个"syntax sugar ed"变体,用于从不同来源收听同一事件。我为给定的事件设置了一个单独的处理程序,我希望有更多的控件侦听相同的事件,同时使用同一处理程序。

少说话,多编码。以下是我想要实现的目标:

// 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的情况下应该是PreviewMouseDownEvent,而不是简单的MouseDown事件。

除此之外,使用RoutedEvent(此处概述)也可以使用AddHandlerRemoveHandler。在这个相关的问题中对此有更多的了解。再次感谢您的投入!

从不同来源收听同一事件

难道不能将其重构为一个以控件为参数的方法吗?

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

此外,这些都是路由事件,您可以在一个共同祖先上处理该事件,然后查看事件的来源以采取相应的行动。

由于您正在使用WPF,最好的做法是对这些事件使用MVVM样式的绑定,然后将XAML中的MouseDown事件绑定到相应视图模型上的相同方法。这将允许您将这些代码一起从代码隐藏中删除,并利用WPF丰富的绑定上下文。

然后可以更进一步,对共享同一事件实现的控件进行模板化,这样就不必在整个XAML中重复绑定。