將控件綁定到多個數據源,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; } }