SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――リストボックス機能

(4) ListBoxコントロール


ダウンロード WPF_VB.zip (322.6 KB)
ダウンロード WPF_CS.zip (212.4 KB)
ダウンロード Silverlight_VB.zip (2.4 MB)
ダウンロード Silverlight_CS.zip (2.3 MB)

15. 選択項目が変更されたことを知る

 選択項目が変更されたことを知るには、SelectionChangedイベントを使用します。

 下記は、選択されている項目が変更されると、新たに選択された項目をメッセージボックスに表示する例です。

選択項目が変更されたことを知る例
選択項目が変更されたことを知る例
VBの例
Private Sub ListBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
    '選択項目を取得
    Dim selectedItem As ListBoxItem = ListBox1.Items(ListBox1.SelectedIndex)

    MessageBox.Show(selectedItem.Content.ToString() & "が選択されました")
End Sub
C#の例
private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // 選択項目を取得
    ListBoxItem selectedItem = (ListBoxItem)listBox1.Items[listBox1.SelectedIndex];

    MessageBox.Show(selectedItem.Content.ToString() + "が選択されました");
}
ポイント

 選択項目が変更されたことを知るにはSelectionChangedイベントを使用する

16. CheckedListBoxコントロールを作成する

 ChekcedListBoxコントロールとは、ListBoxに表示される項目がCheckBoxの機能を持つコントロールです。ChekedListBoxコントロールは従来のWindowsアプリケーションには提供されているのですが、WPFやSilverlightでは提供されていません。そこで、CheckedListBoxコントロールを作成する例を紹介します。

CheckedListBoxコントロールを作成する例
CheckedListBoxコントロールを作成する例

 下記に示したXAMLを見ながら説明を読んでください。

 CheckedListBoxの項目をCheckBoxコントロールにするために、ListBoxItemのスタイルを定義します。スタイルの定義はStyle要素の中で行っています。

 ControlTemplateのTargetType属性でListBoxItemを指定して、項目がCheckBoxコントロールとなるように設定しています。このときCheckBoxコントロールが持つIsChekedプロパティをListBoxItemのIsSelectedプロパティと結びつけています。

 Bindingモードを使用し、CheckBoxがチェックされると、内部的には項目を選択した状態(IsSelectedをTrue)にされるようにしています。また項目を選択状態にすると、反対にCheckBoxがチェックされる(IsCheckedがTrue)ようになります。CheckBox要素内にあるContentPresenter要素は、実際の項目を表しています。

 以上で、CheckedListBoxコントロールのスタイルの作成は終わりです。

 実際に使用するには、ListBoxコントロールのItemContainer属性に作成したスタイルを設定し、SelectionMode属性をMultipleまたはExtendedに設定します。SelectionMode属性にSingleを設定すると、1つの項目にしかチェックを付けることができないので注意してください。

XAMLの例
<Window.Resources>
    <SolidColorBrush x:Key="ListBorder" Color="#828790"/>
    <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <!-- IsSelected プロパティを IsChecked プロパティに関連づけ -->
                    <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="2">
                        <ContentPresenter />
                    </CheckBox>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <ListBox Height="144" HorizontalAlignment="Left" Name="ListBox1" VerticalAlignment="Top" Width="136"
        SelectionMode="Multiple" ItemContainerStyle="{StaticResource ListBoxItemStyle1}" Margin="12,12,0,0">
        <ListBoxItem>リンゴ</ListBoxItem>
        <ListBoxItem>ミカン</ListBoxItem>
        <ListBoxItem IsSelected="True">バナナ</ListBoxItem>
        <ListBoxItem>パイナップル</ListBoxItem>
        <ListBoxItem>スイカ</ListBoxItem>
        <ListBoxItem>グレープフルーツ</ListBoxItem>
    </ListBox>
</Grid>

ポイント

 CheckedListBoxコントロールを作成するには、ControlTemplateを使用してListBoxItemをカスタマイズする。

 項目がチェックボックスになるようCheckBoxに置き換え、IsCheckedプロパティをListBoxItemのIsSelectedプロパティにバインディングする。

まとめ

 今回は、ListBoxコントロールについて取り上げました。

 ListBoxコントロールには多くのプロパティ、イベント、メソッドが備わっており、それ単体でも非常に強力なコントロールです。さらに本記事で紹介したように、カスタマイズすることでさらに強力なコントロールとしてアプリケーションに花を添えてくれることでしょう。

 最後に、ListBoxコントロールのMSDNリンクを下記に記しておきます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5557 2010/11/25 22:09

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー