WPFでstaticな配列をListBoxのItemsSourceにバインドする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
bind-static-array-to-itemssource

WPF で静的な配列の要素をリストボックスやコンボボックスの項目として表示する方法のメモです。

下記のようなクラスに static な配列があるとします。

この Detectors 配列に含まれる項目を下図のようにリストボックスのアイテムとして表示します。

static な配列を ItemsSource にバインドしてみた

スポンサーリンク

x:Static でバインド

XAML の ListBox にこんな感じで Binding を設定します。Binding Source に x:Static でバインドしてやるのがミソです。

このときクラスの属している名前空間を指定する必要があるので、 XAML のルート要素の xmlns が並んでいるところに下記のように名前空間(ここでは Fluorometer )を追加しましょう。この local は好きな文字列で OK ですが、▲のものと一致させましょう。

選択された値(SelectedValue)は DataContext(ViewModel)のプロパティにバインドすれば OK です。ここでは detector クラスのプロパティですね。

これで実行した結果が下図のような感じです。

ただバインドしただけだとクラス名しか表示されない

detector クラスは文字列に変換できない(ToString は実装していない)ので、クラス名だけが表示されています。これでは何がなんなのかさっぱりわかりません。ということで、次に ValueConverter を使って Name プロパティを表示するようにします。

ValueConverter で表示される文字列を変える

配列の型が string 以外の場合は、おそらくリストボックスに表示される文字列をカスタムしたい場合がほとんどでしょう。そんなときは ItemsSource の Binding で Converter を設定するのではなくListBox.ItemTemplate の中で各項目に対して Converter を設定しましょう。

ここでは省略しますが、 IValueConverter を継承したクラスを作り( WPFのIValueConverter実装のテンプレート を参照)、 Window や UserControl のリソースで Converter を生成します。

生成した Converter を ContentPresenter の Binding に設定してやれば OK です。

detector クラスの Name プロパティが表示された

ばっちり表示されました。

最後までお読みいただきありがとうございました m(_ _)m

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存