全局事件处理程序

时间:2010-04-13 18:31:57

标签: wpf events

如何为项目中的任何ListView.GridViewColumnHeader定义一个全局GridViewColumnHeader.Click处理程序?

我的意思是可以在app.xaml中为TargetType = GridViewColumnHeader设置样式或模板,这样项目中任何listview中的任何列标题都会响应app.xaml.cs中的方法吗?

2 个答案:

答案 0 :(得分:2)

虽然它不是全局事件处理程序,但我只是创建一个从ListView继承并在那里实现Click处理程序的新控件。

答案 1 :(得分:1)

是的,有一点需要注意:您可以创建一个适用于所有GridViewColumnHeaders的Style,但不能在其中设置Click事件。但是,您可以设置具有几乎完全相同结果的Command属性:

<Application.Resources>
  <Style TargetType="GridViewColumnHeader">
    <Setter Property="Command"
            Value="{x:Static local:GridViewClickHandler.ClickCommand}" />
  </Style>
  ...

现在只需要创建命令,注册一个类处理程序,然后编写代码来处理它:

public GridViewClickHandler
{
  public RoutedCommand ClickCommand;

  static GridViewClickHandler()
  {
    ClickCommand = new RoutedCommand("ClickCommand", typeof(GridViewClickHandler));
    CommandManager.RegisterClassCommandBinding(
      typeof(GridViewColumnHeader),
      new CommandBinding(ClickCommand, OnColumnHeaderClick));
  }

  static void OnColumnHeaderClick(object sender, ExecutedRoutedEventArgs e)
  {
    // your code here
  }
}

请注意,如果在应用程序的任何其他位置手动设置GridViewColumnHeader的Command属性,它将优先于样式。如果这是一个问题,你可能想要在你的Window上捕获隧道PreviewMouseDown事件并检查每个事件以查看它的原始源是否是GridViewColumnHeader。