【C#】ListBoxで項目を追加、取得する方法(CheckedListBoxも解説)

こんにちは!フリーランスの長野です。

ListBoxって使ってますか?ListBoxはGUIでリストデータを表示する場合に使うコントロールです。WPFでもListBoxを使うことができます。ちなみにWPFとはHTMLに似た感覚で外観デザインを開発することができるGUI開発ライブラリのことです。

この記事では、WPFのListBoxについて

  • ListBoxとは
  • ListBoxの使い方
  • ListBoxに項目を追加する方法
  • ListBoxで選択した項目を取得する方法

といった基本的な内容から、

  • CheckedListBoxの作り方

など応用的な使い方についても解説していきます。今回はWPFのListBoxについて、使い方をわかりやすく解説します。

目次

ListBoxとは

ListBoxはGUIでリストデータを表示、選択する場合に使うコントロールのことです。C#でGUI開発を行う場合、WindowsフォームとWPFの2種類があります。

WindowsフォームはC言語などで使われるWin32 APIを継承しているのに対して、WPFはWin32 APIとは無関係で新たに実装されたGUI開発ライブラリです。

WPFはUI(ユーザー・インターフェイス)要素に拡大・縮小/回転などを掛けることができて、柔軟にカスタマイズできるなどの点で便利なGUI開発ライブラリです。

ListBoxコントロールは、Windowsフォーム、WPFのどちらでも利用できますが、今回はWPFのListViewについてご紹介していきます。

ListBoxの使い方

まずはWPFの使い方ですが、こちらで詳しく解説しているので参考にしてください。

ListViewコントロールは「ツールボックス」の「コモンWPFコントロール」からドラッグ&ドロップすることで使えるようになります。

c#_listbox01

XAMLファイルには自動でListBoxタグが記述されます。

c#_listbox05

これでListBoxコントロールを使えるようになります。

ListBoxに項目を追加する方法

それでは、ListBoxコントロールで選択リストを表示しましょう。ここではBindingを使ってソースコードでまとめて入力する方法について解説します。WPFにはデータ・バインディングという機能があります。

これは表示するデータに不整合がないか検証する機能と外観デザインとを分離する仕組みです。データ・バインディングでは、外観デザインには「ここにはこのデータを表示する」という目印を入れるだけで、実際のデータは別のファイルから提供します。

まず、リストを格納するクラスを作成します。ここでは、PrefListクラスを作成します。

PrefList.cs:

using System.Collections.ObjectModel;
 
public class PrefList {
        public ObservableCollection<string> Data { get; }
        public PrefList() {
            Data = new ObservableCollection<string>();
            Data.Add("北海道");
            Data.Add("青森県");
            Data.Add("岩手県");
            Data.Add("秋田県");
        }
}

MainWindowクラスのコンストラクタでPrefListクラスをインスタンス化します。

MainWindow.xaml.cs:

public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
 
            this.DataContext = new PrefList();
        }
}

XAMLファイルでは、ListBoxコントロールのItemsSourceプロパティに格納する値を取得するためにバインディングを使っています。MainWindowクラスのコンストラクタでPrefListクラスをインスタンス化しているので、PrefListクラスのDataプロパティから取得できています。

MainWindow.xaml(一部のみ):

<ListBox ItemsSource="{Binding Path=Data}" x:Name="listBox" />

実行結果:
c#_wpf10

バインディングについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

ListBoxで選択した項目を取得する方法

ListBoxコントロールで選択した項目をLabelコントロールで表示してみましょう。XAMLファイルでLabelコントロールのContentプロパティを以下のように設定します。バインディングを使っています。

MainWindow.xaml(一部のみ):

<Label x:Name="label" Content="{Binding SelectedValue, ElementName=listBox}" >

実行結果:
c#_listbox03

CheckedListBoxの作り方

ListBoxコントロールで表示されるリストの中でどの項目が選択されたかをチェックボックスで確認するようにしたコントロールのことをCheckedListBoxコントロールと呼びます。

しかし、CheckedListBoxコントロールは「ツールボックス」にあらかじめ用意されていません。ListBoxコントロールをカスタマイズして作成する必要があります。XAMLファイルに記述を追加します。ListBoxクラスにはItemContainerStyleプロパティがあります。

ここでListBoxItemのStyleを指定します。StyleでTemplateをCheckBoxに変更し、Contentプロパティをバインディングしています。MainWindow.xaml(一部のみ):

<ListBox ItemsSource="{Binding Path=Data}" x:Name="listBox" >
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <CheckBox Content="{TemplateBinding Content}" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
</ListBox>

実行結果:
c#_listbox04

まとめ

ここではListBoxコントロールについて説明しました。ListBoxコントロールはリスト形式のデータを手軽に表示することができます。使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次