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」がnullになっているため、コードが失敗します。明らかに、これは予期された動作ではありません。ここで、OriginalSourceがGridViewColumnHeaderであることを確認する必要があります。

なぜこれが起こるのですか?

4

1 に答える 1

1

問題は、GridViewColumnHeader.ClickEvent実際にはです。つまり、設定しButtonBase.ClickEventハンドラーは、列ヘッダー(これはボタンから派生しています)。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/3595d153-4faa-4501-9c6f-2f074658e760を参照してください

私が見つけた唯一の解決策は、他のことをheader != nullする前に、ハンドラーをトリガーしたボタン(e.OriginalSource)が列ヘッダーでないときにハンドラーを終了することを確認することです。

お役に立てれば...

(追記:header.Column != nullユーザーが「最後の追加ヘッダー」をクリックしたときのエラーを回避するために、すべての「通常の」ヘッダーの右側にある空のヘッダーを確認してください...)

于 2012-05-11T14:16:08.030 に答える