2014年5月29日木曜日

wpf : ListBoxの選択項目がクリックで変更されたことを検出する

ListBoxやListViewの選択項目がクリックで変更されたときに実行したい処理があったので、検出のしかたを調べてみました。 ヒントになったのはこんな情報。

参考ページにはListViewの選択済みの項目がクリックされたのを検出する方法が書いてありますね。 ListViewItemのPreviewMouseLeftButtonDownイベントで検出しています。 Previewイベントという事でListViewの選択項目が反映される前のListViewItemの状態を見る事ができます。 そこでIsSelectedを見れば、まだ選択されていないものがクリックされてこれから選択が変更されるところなのか、選択済みのものがクリックされたのかが分かるという仕組みです。

ListViewでもListBoxでもだいたい同じです。 そして、IsSelectedを見て分岐するところを参考ページと逆にすれば目的が達成できそうですね。

あと注意すべきなのは、参考ページではマウスの左ボタンしか見てませんが、選択項目の変更は右ボタンでもできるということです。 PreviewMouseRightButtonDownも見る必要があります。 PreviewMouseDownでもok。 その場合はマウスの真ん中ボタンでは選択項目の変更は起きないので左右のボタンだけを見張るようにしましょう。

それをふまえて作ったサンプルコードはこちら。 まずは、MainWindow.xamlから。

MainWindow.xaml.csです。

サンプルコードを動かすと、マウスクリックで選択項目が変わったときだけ選択項目の文字列にビックリマークが追加されるのが確認できます。 選択済みの項目をクリックしても変化はありません。