WPFのコンバーターとは?その作り方は?

C#, Visual Studio, WPF, XAML

WPFのコンバーターとは、System.Windows.Data.IValueConverterインターフェイスが実装されたクラスのこと。
コンバーターはその名の通り、「変換するもの」。
コンバーターが用意されていると、例えばこんなことができる。

ウィンドウにチェックボックスとテキストブロックがある。テキストブロックには「いいえ」と表示されている。

チェックボックスにチェックを入れると、テキストブロックの文字が「はい」に変わる。

この例の場合、コンバーターによりチェックボックスのIsCheckedプロパティが "はい" または "いいえ" という文字列に変換されている。

この例の他にも、コンバーターで次のようなことができる。

  • bool型の値をVisibility型に変換するコンバーター(Prism.WpfやLivetには標準で含まれている)
  • 数値を、その大きさに応じて kB単位や MB単位の数字と単位の文字列に自動で変換するコンバーター

コンバーターは作るとなるとそれなりに手間だし、数が増えすぎると管理も煩雑になりがちなので、できるだけ必要な数種類を何度も使い回せるように整備しておくのがオススメ。

上の最初の例で使うコンバーターは次のようにして作れる。

  1. Visual StudioのWPFプロジェクト内に、Convertersフォルダ(名前は何でもよい)と、新しいC#クラスを追加する。
  2. 赤い下線の部分を追記する。
  3. "IValueConverter" の上のマウスポインタを置くと、電球マークのアイコンが表示される。このアイコンをクリックすると、下図のような選択肢が表示されるので、「インターフェイスを実装します。」をクリックする。
  4. コンバーターの雛形が自動生成される。
  5. 次のように実装する。

以上で、コンバーター本体の実装は終わり。
続いて、XAMLからコンバーターを利用するコードを書く。

  1. デザイナー上に、チェックボックスとテキストブロックを1つずつ配置する。レイアウトパネルはコンバーターとは無関係なのでテキトーでOK。
  2. テキストブロックのプロパティを開き、赤丸で囲んだ■をクリックする。
  3. 「データバインディングの作成...」をクリックする。
  4. 次のように設定する。
    バインドの種類:ElementName
    要素名:配置したチェックボックスを選択する。
    パス:IsChecked
    コンバーター:<値コンバーターの追加...> (新たに画面が開く)
  5. BooleanToYesNoConverter を選択してOKボタンを押す。
  6. OKボタンを押す。
  7. ビルド・実行してみて、チェックボックスにチェックを入れたり外したりしてみよう。チェックが入っているときは、テキストブロックの文字が「はい」になり、そうでないときは「いいえ」になっていればOK。