WPFでstaticな配列をListBoxのItemsSourceにバインドする
WPF で静的な配列の要素をリストボックスやコンボボックスの項目として表示する方法のメモです。
下記のようなクラスに static な配列があるとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
namespace Fluorometer { public static class Db { public static detector[] Detectors = new detector[] { new detector { id = 1, name = "InGaAs 5mm" }, new detector { id = 2, name = "InGaAs 1mm" }, new detector { id = 3, name = "InGaAs 0.5mm" }, new detector { id = 4, name = "Photomultiplier" }, new detector { id = 5, name = "InSb" }, }; } } |
この Detectors 配列に含まれる項目を下図のようにリストボックスのアイテムとして表示します。
x:Static でバインド
XAML の ListBox にこんな感じで Binding を設定します。Binding Source に x:Static でバインドしてやるのがミソです。
1 2 3 |
<ListBox ItemsSource="{Binding Source={x:Static local:Db.Detectors}}" SelectedValue="{Binding Detector}"> </ListBox> |
このときクラスの属している名前空間を指定する必要があるので、 XAML のルート要素の xmlns が並んでいるところに下記のように名前空間(ここでは Fluorometer )を追加しましょう。この local は好きな文字列で OK ですが、▲のものと一致させましょう。
1 2 3 |
<Window ~ 中略 ~ xmlns:local="clr-namespace:Fluorometer"> |
選択された値(SelectedValue)は DataContext(ViewModel)のプロパティにバインドすれば OK です。ここでは detector クラスのプロパティですね。
これで実行した結果が下図のような感じです。
detector クラスは文字列に変換できない(ToString は実装していない)ので、クラス名だけが表示されています。これでは何がなんなのかさっぱりわかりません。ということで、次に ValueConverter を使って Name プロパティを表示するようにします。
ValueConverter で表示される文字列を変える
配列の型が string 以外の場合は、おそらくリストボックスに表示される文字列をカスタムしたい場合がほとんどでしょう。そんなときは ItemsSource の Binding で Converter を設定するのではなく、ListBox.ItemTemplate の中で各項目に対して Converter を設定しましょう。
ここでは省略しますが、 IValueConverter を継承したクラスを作り( WPFのIValueConverter実装のテンプレート を参照)、 Window や UserControl のリソースで Converter を生成します。
1 2 3 |
<Window.Resources> <local:DetectorConverter x:Key="DetectorConverter"/> </Window.Resources> |
生成した Converter を ContentPresenter の Binding に設定してやれば OK です。
1 2 3 4 5 6 7 |
<ListBox ItemsSource="{Binding Source={x:Static local:Db.Detectors}}" SelectedValue="{Binding Detector}"> <ListBox.ItemTemplate> <DataTemplate> <ContentPresenter Content="{Binding Converter={StaticResource DetectorConverter}}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> |
ばっちり表示されました。
最後までお読みいただきありがとうございました m(_ _)m