1

我正在使用附加行为来添加通过单击列标题对 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 有一个滚动条,我点击滚动条的“轴”或滚动箭头(但不是拇指!):

滚动条的剖析
(来源:microsoft.com

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

为什么会这样?

4

1 回答 1

1

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

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

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

希望这可以帮助...

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

于 2012-05-11T14:16:08.030 回答