Binding Expression for WPF/Silverlight
C1Binding Expression の操作

WPF および Silverlight では、データ値を UI のプロパティに接続するために Binding オブジェクトが使用されます。たとえば、TextBlock 要素に顧客の名前を表示するには、次の XAML を使用できます。

XAML
コードのコピー
<TextBlock Text="{Binding FirstName}" />

この例で、TextBlockText プロパティは、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>

このソリューションは正しく動作しますが、いくつか欠点があります。

関連トピック