从不同来源收听同一事件

时间:2012-01-31 17:32:33

标签: c# wpf event-handling wpf-controls

我只是想知道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),还可以使用AddHandlerRemoveHandler。更多关于this related question的内容。再次感谢您的投入!

2 个答案:

答案 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中重复绑定。