我只是想知道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
(此处概述)也可以使用AddHandler
和RemoveHandler
。在这个相关的问题中对此有更多的了解。再次感谢您的投入!
难道不能将其重构为一个以控件为参数的方法吗?
void Listen(UIElement element)
{
if (pEnable) element.MouseDown += MyMouseDownEventHandler
else element.MouseDown -= MyMouseEventHandler;
}
此外,这些都是路由事件,您可以在一个共同祖先上处理该事件,然后查看事件的来源以采取相应的行动。
由于您正在使用WPF,最好的做法是对这些事件使用MVVM样式的绑定,然后将XAML中的MouseDown事件绑定到相应视图模型上的相同方法。这将允许您将这些代码一起从代码隐藏中删除,并利用WPF丰富的绑定上下文。
然后可以更进一步,对共享同一事件实现的控件进行模板化,这样就不必在整个XAML中重复绑定。