WisdomSoft - for your serial experiences.

7.4 値の変換

バインディングするデータのソースとターゲットの型が異なる場合、バインディング時に型変換を行う変換機を提供することでバインディングを可能とします。

7.4.1 異なるデータ型のバインディング

バインディングソースとターゲットのプロパティ型が共通していれば、これまでのように直接値を交換することができますが、当然、ソースとターゲットのプロパティのデータ型に互換性がない場合は、正しい値を設定することができません。

そこで、コントロールが表現するデータ型と、ソースプロパティの型が異なる場合は、バインディング時にデータ変換を行うことができます。データ変換を行う場合は、Binding オブジェクトの Converter プロパティを使います。

Binding クラス Converter プロパティ
public IValueConverter Converter { get; set; }

Converter プロパティは、バインディングによるデータの更新を行うときにデータ変換を行うメソッドを宣言する System.Windows.Data.IValueConverter インターフェイスを実装するオブジェクトを設定します。

System.Windows.Data.IValueConverter インターフェイス
public interface IValueConverter

IValueConverter インターフェイスには、ソースからターゲットへのデータ変換を行う Convert() メソッドと、ターゲットからソースへのデータ変換を行う ConvertBack() メソッドが宣言されています。

IValueConverter クラス Convert() メソッド
Object Convert (
    Object value, Type targetType,
    Object parameter, CultureInfo culture
)
IValueConverter クラス ConvertBack() メソッド
Object ConvertBack (
    Object value, Type targetType,
    Object parameter, CultureInfo culture
)

value には、変更が要求されているデータが渡されます。すなわち Conver() メソッドの場合はバインディングソースの値、ConvertBack() メソッドの場合はバインディングターゲットの値です。targetType には、データ出力先のプロパティの型です。すなわち、Convert() メソッドの場合はターゲットの型、ConvertBack() メソッドの場合はソースの型です。parameter には、変換に使用するパラメータ、culture には、使用する ColtureInfo オブジェクトが渡されます。

これらのメソッドの結果は、元の値である value を使って変換された任意の値です。戻り値は Object 型なのでどのようなデータ型も返すことができますが、targetType 型に互換性がなければいけません。

コード1
using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Media;
using System.Globalization;

class BooleanConverter : IValueConverter {
	private object trueObj, falseObj;
	public BooleanConverter(object trueObj, object falseObj) {
		this.trueObj = trueObj;
		this.falseObj = falseObj;
	}

	public object Convert(
		object value, Type targetType,
		object parameter, CultureInfo culture
	) {
		Console.WriteLine(
			"Converter : value=" + value +
			", targetType=" + targetType
		);
		if ((bool)value) return trueObj;
		else return falseObj;
	}
	public object ConvertBack(
		object value, Type targetType,
		object parameter, CultureInfo culture
	) {
		if (value.Equals(trueObj)) return true;
		else return false;
	}
}

class Test {
	[STAThread]
	public static void Main() {
		CheckBox backButton = new CheckBox();
		backButton.Content = "背景色を赤にする";

		Binding backBind = new Binding("IsChecked");
		backBind.Converter = new BooleanConverter(Brushes.Red, Brushes.White);
		backBind.Source = backButton;

		Window wnd = new Window();
		wnd.Content = backButton;
		wnd.SetBinding(Control.BackgroundProperty, backBind);

		Application app = new Application();
		app.Run(wnd);
	}
}
実行結果
コード1 実行結果

コード1は、チェックボックスにチェックを入れるとウィンドウの背景色が赤に設定され、チェックを外すと白になるというプログラムです。チェックボックスの選択状態は bool 型であるのに対し、ウィンドウの背景色は Brush 型なので、互いのプロパティに互換性はありません。

そこで、このプログラムでは BooleanConverter という変換クラスを作成して Binding オブジェクトに設定しています。バインディングが必要とされたとき、Converter プロパティに有効な IValueConverter が設定されていれば Convert() メソッドや ConvertBack() メソッドが呼び出されます。このメソッド内で、渡されたデータを適切なデータに変換することができます。このプログラムのバインディングは、常にソースであるチェックボックスからターゲットであるウィンドウに対して片方向に行われるため、事実上 ConvertBack() メソッドが呼び出されることはありません。