我只是想知道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
s应该是PreviewMouseDownEvent
,而不是简单的MouseDown
事件。
除此之外,使用RoutedEvent
s(概述here),还可以使用AddHandler
和RemoveHandler
。更多关于this related question的内容。再次感谢您的投入!
答案 0 :(得分:3)
难道你不能将它重构为一个将控制作为参数的方法吗?
void Listen(UIElement element)
{
if (pEnable) element.MouseDown += MyMouseDownEventHandler
else element.MouseDown -= MyMouseEventHandler;
}
同样是routed events,你可以在一个共同的祖先上处理事件,然后看看事件的来源是相应的行为。
答案 1 :(得分:1)
由于您正在使用WPF,最好的办法是对这些事件使用MVVM样式绑定,然后将XAML中的MouseDown事件绑定到相应视图模型上的相同方法。这将允许您从后面的代码中一起删除此代码,并利用WPF的丰富绑定上下文。
然后,您可以更进一步模拟共享相同事件实现的控件,这样您就不必在整个XAML中重复绑定。