none
ListBox.SelectedItemをコードビハインドで変更した場合の動作について RRS feed

  • 質問

  • お世話になります。

    ListBoxでSelectionModeがExtendの時に、コードビハインドやViewModel側でSelectedItemを変更した場合の動作について質問があります。

    サンプルとしてListBoxにItemが4つあり、下のボタンでSelectedItemを「C」に変更するだけのものがあります。

    <Window x:Class="WpfApplication.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Width="300" Height="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <ListBox x:Name="listBox" Grid.Row="0" SelectionMode="Extended">
                <ListBoxItem x:Name="itemA" Content="A" />
                <ListBoxItem x:Name="itemB" Content="B" />
                <ListBoxItem x:Name="itemC" Content="C" />
                <ListBoxItem x:Name="itemD" Content="D" />
            </ListBox>
            <Button Grid.Row="1" x:Name="button" Click="button_Click" />
        </Grid>
    </Window>

            private void button_Click(object sender, RoutedEventArgs e)
            {
                listBox.SelectedItem = itemC;
            }

    このプログラムで以下の問題が起きています。

    1. マウスクリックで「A」を選択する
    2. ボタンを押下し、「C」が選択状態になる
    3. この状態で Ctrlを押しながら、「D」を選択しようとすると 1.で選択されていた「A」から「D」が選択されてしまう

    選択されている「C」と「D」を選択する術はないでしょうか?

    単純な知識不足かとも思いますが、ご教授お願いいたします。



    2013年9月12日 9:41

回答


  • CtrlじゃなくてShiftですよね?
    SelectionModeがうまく動いていないみたいなので、いったん外してみた。

    listBox.SelectionMode = SelectionMode.Single;
    listBox.SelectedItem = itemC;
    listBox.SelectionMode = SelectionMode.Extended;

    #4.5だとAnchorItemがありますが、4.0以下は無い...

    以下4.5以降で可能なコードを追記

    <app:ListBoxEx xmlns:app="clr-namespace:WpfApplication1"
        x:Name="listBox" Grid.Row="0" SelectionMode="Extended" >
        <ListBoxItem x:Name="itemA" Content="A" />
        <ListBoxItem x:Name="itemB" Content="B" />
        <ListBoxItem x:Name="itemC" Content="C" />
        <ListBoxItem x:Name="itemD" Content="D" />
    </app:ListBoxEx>
    class ListBoxEx : ListBox
    {
        public void SetAnchor(object o)
        {//.Net Framework4.5以降のみ可能
            base.AnchorItem = o;
        }
    }
    private void button_Click(object sender, RoutedEventArgs e)
    {
        listBox.SelectedItem = itemC;
        listBox.SetAnchor(itemC);
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2013年9月12日 13:48 4.5用コード追加
    • 回答としてマーク Kinenow 2013年9月13日 5:17
    2013年9月12日 12:48

すべての返信


  • CtrlじゃなくてShiftですよね?
    SelectionModeがうまく動いていないみたいなので、いったん外してみた。

    listBox.SelectionMode = SelectionMode.Single;
    listBox.SelectedItem = itemC;
    listBox.SelectionMode = SelectionMode.Extended;

    #4.5だとAnchorItemがありますが、4.0以下は無い...

    以下4.5以降で可能なコードを追記

    <app:ListBoxEx xmlns:app="clr-namespace:WpfApplication1"
        x:Name="listBox" Grid.Row="0" SelectionMode="Extended" >
        <ListBoxItem x:Name="itemA" Content="A" />
        <ListBoxItem x:Name="itemB" Content="B" />
        <ListBoxItem x:Name="itemC" Content="C" />
        <ListBoxItem x:Name="itemD" Content="D" />
    </app:ListBoxEx>
    class ListBoxEx : ListBox
    {
        public void SetAnchor(object o)
        {//.Net Framework4.5以降のみ可能
            base.AnchorItem = o;
        }
    }
    private void button_Click(object sender, RoutedEventArgs e)
    {
        listBox.SelectedItem = itemC;
        listBox.SetAnchor(itemC);
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2013年9月12日 13:48 4.5用コード追加
    • 回答としてマーク Kinenow 2013年9月13日 5:17
    2013年9月12日 12:48
  • gekkaさんのコードを適用したところ、期待通りの動作をしてくれました!

    ただ、AnchorItemはXPを動作環境にしているため、使えませんでした(XPに.NET 4.5入りません・・)

    ありがとうございました!また機会がありましたらよろしくお願いいたします。

    2013年9月13日 5:20
  • もしくは、以下でも大丈夫だと思います。

    listBox.UnselectAll();
    listBox.SelectedItem = itemC;

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年9月13日 5:51
    モデレータ