將控件綁定到多個數據源,ListBox綁定到一個集合,其中每一項綁定到集合中對象的兩個屬性,並對綁定進行了格式化。
<ListBox ItemsSource="{StaticResource MyData}" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} -- Now only {1:C}!">
<Binding Path="Description"/>
<Binding Path="Price"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
多源綁定的自定義值轉換。下面TextBlock控件綁定到NameListData集合中的一項,當集合中的某個對象被選擇後,該對象的兩個屬性同自定義轉換器轉換為顯示值,對象的兩個屬性分別是FirstName和LastName,通過轉換器,控件顯示完整的姓名。這類似上述的多源綁定的格式化,但轉換器可以接受參數,因此更靈活,此處,可以通過參數控制FirstName和LastName的顯示順序。
<TextBlock Name="textBox1" DataContext="{StaticResource NameListData}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myNameConverter}" ConverterParameter="FormatNormal">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
下面是自定義轉換器的實現,該類必須實現接口IMultiValueConverter,其中Convert實現數據源到控件方向的轉換,而ConvertBack相反:
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;
}
}