2012-05-03 144 views
1

我使用附加行爲來添加通過單擊列標題來排序ListView的能力。行爲添加以下處理程序來處理在GridViewColumnHeader用戶點擊:GridViewColumnHeader.Click通過單擊ListView的滾動條軸和滾動箭頭觸發

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.C lickEvent被觸發,並且我的代碼失敗,因爲'header'現在爲空。顯然這不是預期的行爲,現在我必須確保OriginalSource是一個GridViewColumnHeader。

爲什麼會發生這種情況?

回答

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,以避免一個錯誤,當上了「最後的附標題」用戶點擊,對所有的「正規」右側的空頭頭文件...)

+0

感謝PS,我沒有注意到這個問題出現在我們的代碼中。 –