C# 从不同来源收听同一事件

C# 从不同来源收听同一事件,c#,wpf,event-handling,wpf-controls,C#,Wpf,Event Handling,Wpf Controls,我只是想知道C#/WPF是否有一个“语法加糖”变体,用于从不同的来源监听同一事件。我为给定事件设置了一个单独的处理程序,我希望更多的控件在使用相同的处理程序时侦听相同的事件 少说话,多编码。以下是我想要实现的目标: // Presuming pEnable is a parameter, a simple bool if (pEnable) SomeControl.MouseDown += MyMouseDownEventHandler else SomeControl.Mous

我只是想知道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
s的情况下,这应该是
PreviewMouseDownEvent
,而不是简单的
MouseDown
事件


除此之外,使用
RoutedEvent
s(概述)还可以使用
AddHandler
removehdler
。更多关于这方面的信息,请参阅。再次感谢您的投入

你不能把它重构成一个以控件为参数的方法吗

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

同样,您可以在一个公共祖先上处理事件,然后查看事件的源如何相应地进行操作。

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

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

同样,您可以在一个公共祖先上处理事件,然后查看事件的源如何相应地执行操作。

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


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

因为您使用的是WPF,所以最好对这些事件使用MVVM样式的绑定,然后将XAML中的MouseDown事件绑定到适当的视图模型。这将允许您将这些代码一起从代码隐藏中删除,并利用WPF丰富的绑定上下文


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

我现在已经尝试过了,事件似乎没有“粘滞”,必须与参数传递有关,尝试使用ref.@Dr1Ku:这不会改变任何东西,如果希望动态订阅和取消订阅事件,则应以完全不同的方式处理,例如,使用
pEnable
属性,该属性的setter中包含方法调用。这样,每当
pEnable
更改时,事件处理程序要么被删除,要么被添加。(不确定这是否是一个非常好的想法,但在架构方面)再次感谢高级解决方案!原来我订阅了错误的事件:)我现在尝试了,事件似乎没有“粘滞”,一定与参数传递有关,尝试使用ref.@Dr1Ku:这不会改变任何事情,如果你想动态订阅和取消订阅事件,你应该完全不同地处理它,例如,
pEnable
的属性在其setter中具有方法调用。这样,每当
pEnable
更改时,事件处理程序要么被删除,要么被添加。(不确定这是否是一个非常好的想法,但在架构方面)再次感谢高级解决方案!原来我订阅了错误的事件:)