如何在XAML中为附加事件添加多个处理程序?

3

代码示例:

<DataTemplate x:Key="NodeDataTemplate">
    <Border Style="{StaticResource nodeBorderStyle}"
                        MouseEnter="SetMouseCursor_Arrow"
                        MouseLeave="SetMouseCursor_ScrollAll"
                        MouseLeftButtonDown="ViewLink"
                        MouseLeftButtonDown="SetFlagForCursorTracking">
....
</DataTemplate>

我想要向一个特定事件添加2个处理程序,如上所示。然而,这样不会编译 -“属性可以被设置多次”。我有多个方法,因为它们执行不同的操作(已经适当命名)。例如,第一个处理程序与第二个处理程序没有任何共同之处。

我的另一个选择是通过一个“SetFlagForCursorTrackingAndCheckForViewLink”方法来解决问题-这很糟糕!你有什么建议?

2个回答

3
请尝试添加一个处理程序,随后调用一些事件处理方法。或者添加一个处理程序,随后调用您想要的两个事件处理方法 - 这将更加优雅。

我更倾向于使用巧妙的方法,因为这样就少了一个需要寻找可接受名称的方法,例如委托者。我的主要目标是可读性和可维护性。例如,如果有人想要修复光标跟踪的错误,应该从XAML数据模板中以某种方式看到它...除非我将委托者命名为我选择的巧妙方法的名称...除非有更好的答案-我猜你会得到认可的标记。 - Gishu
Akash 提交的代码在我看来并不是最好的——它当然可以工作,但这是一个紧密绑定的完美例子,阻碍了您轻松对 XAML 进行更改的途径。试着从我的回答角度来看:如果在您的视图中引发了事件,则只会调用一个方法(或命令)在您的代码后台(或分别 VM)中执行进一步的操作(调用其他处理方法)。这是一个非常清晰和优雅的解决方案。请告诉我您是否有任何进一步的疑虑。 - Piotr Justyna
顺便问一下,为什么要把它命名为delegator? :) 对于CB中的事件处理方法,使用On[UIElementName]_[UIEvent](例如OnMyButton_Click)会更少混淆 - 它将执行进一步的操作。VM也应该关注同样的事情,但是我建议使用[UIElementFunctionality]而不是[UIElementName] - 例如SearchUsersCommand / ShowUsersCommand / HideUsersCommand。 - Piotr Justyna
我本来不想把它命名为delegator :),但这就是它的作用...在这种情况下,它的名称最好应该结合所有它将触发的东西。 - Gishu
在任何情况下,imo :) 名称只应反映该方法实际上正在处理指定的事件/操作 - 记住要避免紧密绑定。这是该方法的主体,应包含适当的操作。 - Piotr Justyna

0

你可以在代码后台完成这个操作,

UIObject.AddHandler( AttachedEventContainer.AttachedEvent, your_handler);

UIObject.AddHandler( AttachedEventContainer.AttachedEvent, your_handler);

我并没有尝试或测试过这个,如果出现任何错误,则您别无选择,只能手动使用一种方法并调用两个事件处理程序,并将该方法附加为事件处理程序。


事件发布器嵌入到一个(可能是可共享的)数据模板中。要添加代码后台,我必须为ResourceDictionary添加代码后台...虽然可行,但太麻烦了。由于这是目前唯一的障碍,因此我会使用曲线救国的方法。 - Gishu
我认为你想在MouseLeftButtonDown事件中实现一些视觉效果,如果是这样的话,为什么不派生并创建一个自定义控件,在自定义代码中保留你的视觉效果代码,而只将“ViewLink”业务逻辑放在数据模板中呢? - Akash Kava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接