通过单击ListView的滚动条轴和触发器触发GridViewColumnHeader.Click;滚动箭头

时间:2012-05-03 15:47:38

标签: wpf wpf-controls

我正在使用附加行为来添加通过单击列标题对ListView进行排序的功能。该行为添加了以下处理程序来处理用户单击GridViewColumnHeader:

listView.AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(ColumnHeader_Click));

处理程序看起来像这样:

static void ColumnHeader_Click(object sender, RoutedEventArgs e)
{
   var listView = sender as ListView;
   var header = e.OriginalSource as GridViewColumnHeader;
   var gridView = ((GridView)(listView.View));
   ...
}

我刚注意到如果ListView有一个滚动条,我点击滚动条的'竖井'或滚动箭头(但不是拇指!):

Anatomy of a Scroll Bar http://i.msdn.microsoft.com/dynimg/IC79322.gif

然后触发GridViewColumnHeader.ClickEvent,我的代码失败,因为'header'现在为null。显然这不是预期的行为,现在我必须确保OriginalSource是GridViewColumnHeader。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

问题是,GridViewColumnHeader.ClickEvent实际上是ButtonBase.ClickEvent,这意味着您设置的处理程序将由用户点击任何按钮(或派生:复选框, ListView中的datepicker,滚动条按钮等),而不仅仅是列标题(从按钮派生)。

请参阅http://social.msdn.microsoft.com/Forums/en/wpf/thread/3595d153-4faa-4501-9c6f-2f074658e760

我找到的唯一解决方案是在执行任何其他操作之前检查header != null,以便在触发它的按钮(e.OriginalSource)不是列标题时退出处理程序。

希望这会有所帮助......

(PS:还要检查header.Column != null,以避免在用户点击“最后一个额外标题”时出现错误,所有“常规”标题右侧的空标题...)