WPF および Silverlight では、データ値を UI のプロパティに接続するために Binding オブジェクトが使用されます。たとえば、TextBlock 要素に顧客の名前を表示するには、次の XAML を使用できます。
XAML |
コードのコピー
|
---|---|
<TextBlock Text="{Binding FirstName}" />
|
この例で、TextBlock の Text プロパティは、TextBox 要素またはそのいずれかの祖先のDataContext プロパティに現在割り当てられているデータオブジェクトの FirstName プロパティの内容と自動的に同期されます。
Binding クラスは便利ですが、柔軟性は高くありません。たとえば、前述の TextBlockを顧客のフルネームに連結する場合、または顧客アカウントがマイナスの場合にテキストを赤色にする場合は、Convrter が必要になります。
Binding オブジェクトの Converter パラメータを使用することにより、連結に任意のロジックを追加して、ソースとターゲットの間を転送される値を変換できます。
たとえば、前述の例を使用して、TextBlockに顧客のフルネームを表示し、顧客のアカウントがマイナスの場合にテキストを赤色で表示することにします。それには2つのコンバータが必要で、それらを次のように実装します。
XAML |
コードのコピー
|
---|---|
/// <summary> /// Foreground プロパティのコンバータ:顧客の金額がマイナスの場合は赤色のブラシを返し、 /// そうでない場合は黒色のブラシを返します。 /// </summary> public class ForegroundConverter : System.Windows.Data.IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var c = value as Customer; return c.Amount < 0 ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Black); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } /// <summary> /// 顧客のフルネームのコンバータ:顧客のフルネームを含む /// 文字列を返します。 /// </summary> public class FullNameConverter : System.Windows.Data.IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var c = value as Customer; return string.Format("{0} {1}", c.FirstName, c.LastName); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } |
コンバータを定義したら、次のように XAML で使用できます。
XAML |
コードのコピー
|
---|---|
<Grid> <Grid.Resources> <local:FullNameConverter x:Key="_cvtFullName" /> <local:ForegroundConverter x:Key="_cvtForeground" /> </Grid.Resources> <TextBlock Text="{Binding Converter={StaticResource _cvtFullName}}" Foreground="{Binding Converter={StaticResource _cvtForeground}}" /> </Grid> |
このソリューションは正しく動作しますが、いくつか欠点があります。
XAML を見ても、どのように出力されるのかはわかりません。 たとえば、この色コンバータは、どのようなロジックを使用してどのような色を返すのかわかりません。それを確認するには、コンバータの実装を見てみるしかありません。
TextBlock 要素の Opacity、Visibility、FontWeight などのプロパティを設定するには、さらにいくつかのコンバータクラスを作成し、それらをいつも XAML とセットにしておく必要があります。
コンバータクラスのセマンティクスは、あるオブジェクトを別のオブジェクトに変換することだけを規定しています。これにより、柔軟性は高くなりますが、コンバータは多少脆弱になります。