次の方法で共有


方法: バインドされた項目の一覧に基づいて値を生成する

MultiBinding を使用すると、ソース プロパティの一覧にバインディング ターゲット プロパティをバインドし、指定した入力で値を生成するロジックを適用することができます。 この例では、MultiBinding の使用方法を示します。

次の例では、NameListData は、PersonName オブジェクトのコレクションを参照します。このオブジェクトは、firstNamelastName の 2 つのプロパティを含みます。 個人の氏名を姓から先に表示する TextBlock を生成する例を次に示します。

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:SDKSample"
  x:Class="SDKSample.Window1"
  Width="400"
  Height="280"
  Title="MultiBinding Sample">
    
  <Window.Resources>
    <c:NameList x:Key="NameListData"/>
    <c:NameConverter x:Key="myNameConverter"/>
</Window.Resources>
<TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myNameConverter}"
                  ConverterParameter="FormatLastFirst">
      <Binding Path="FirstName"/>
      <Binding Path="LastName"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
</Window>

姓が先の形式を生成する方法を理解するには、次に示す NameConverter の実装をご覧ください。

public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string name;

        switch ((string)parameter)
        {
            case "FormatLastFirst":
                name = values[1] + ", " + values[0];
                break;
            case "FormatNormal":
            default:
                name = values[0] + " " + values[1];
                break;
        }

        return name;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        string[] splitValues = ((string)value).Split(' ');
        return splitValues;
    }
}
Public Class NameConverter
    Implements IMultiValueConverter

Public Function Convert1(ByVal values() As Object, _
                         ByVal targetType As System.Type, _
                         ByVal parameter As Object, _
                         ByVal culture As System.Globalization.CultureInfo) As Object _
                         Implements System.Windows.Data.IMultiValueConverter.Convert
    Select Case CStr(parameter)
        Case "FormatLastFirst"
            Return (values(1) & ", " & values(0))
    End Select
    Return (values(0) & " " & values(1))
End Function

Public Function ConvertBack1(ByVal value As Object, _
                             ByVal targetTypes() As System.Type, _
                             ByVal parameter As Object, _
                             ByVal culture As System.Globalization.CultureInfo) As Object() _
                             Implements System.Windows.Data.IMultiValueConverter.ConvertBack
    Return CStr(value).Split(New Char() {" "c})
End Function
End Class

NameConverter は、IMultiValueConverter インターフェイスを実装します。 NameConverter は、個々のバインディングから値を受け取り、それらを値のオブジェクト配列に格納します。 Binding 要素が MultiBinding 要素の下に表示される順序は、値が配列内に格納されている順序です。 ConverterParameter 属性の値は、名前の形式を決定するパラメーターの切り替えを実行する Converter メソッドのパラメーター引数によって参照されます。

関連項目