WPFのListBox.SelectedItemの挙動がおかしい

最近、ツールを作るときに、Windows Forms ではなくて、WPF を使っています。

理由の第一は、UI が綺麗に作れるから、なんですが、通常のフォームアプリケーションを作るのと勝手が違う or 動きがおかしい、とろが多々あって、ちょっと避けるべき理由もちらほら。

今、使っているのは WPF のリストボックスなのですが、どうやら、

  1. リストボックスの項目を Remove メソッドで削除する。
  2. カーソルを設定するために SelectedIndex で選択させる。
  3. この後、カーソルキーの上矢印や下矢印キーを押すと、先頭にカーソルが移動してしまう。

という現象です。

削除する場合は、次のコードのように、DELETEキーを押したときに、選択行を削除します。

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Delete)
    {
        int index = listBox1.SelectedIndex;
        listBox1.Items.RemoveAt(index);
        index–;
        if (index < 0) index = 0;
        listBox1.SelectedIndex = index;
    }
}

こうするとですね、せっかく SelectedIndex を設定していのに、上下の矢印キーで先頭の行にジャンプしてしまうんですよね。。。どうも、SelectedIndex の値が、内部で反映されていない気がします。

# 似たような現象を、Siverlight の ListBox で経験したような覚えがあるんだけど…ちょっと、解決策を思い出せず。
# XAML で保持しているプロパティに反映されていない雰囲気なんですね。

解決したら追記を書きます。

追記 2010/07/08
へっぽこ独自Silverlightフレームワークが、そんな動きをしていたなぁと思い出した。
MVVM が分かっていなくて、コントロール自身をINotifyChangedをしていたフレームワーク。
まさか、そんなことあるまいな>MS

追記 2010/07/08
どうやら、バグっぽい。

全く同じコードをWindows フォームで動かすと正常に動くので、Microsoftさんにフィードバックしました。
http://connect.microsoft.com/VisualStudioJapan/feedback/details/573823/wpf-listbox-selectedindex

カテゴリー: 開発 パーマリンク