我正在使用附加行为来添加通过单击列标题对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。
为什么会这样?
答案 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
,以避免在用户点击“最后一个额外标题”时出现错误,所有“常规”标题右侧的空标题...)