有時候UI要顯示的資訊又不止一個資料來源決定,就需要使用MultiBinding,MultiBinding具有一個名為Bindings的屬性,其類型是Collection<BindingBase>,通過這個屬性MultiBinding把一組Binding對象聚合起來,處在這個集合中的Binding對象可以擁有自己的資料校驗與轉換機制,它們彙集起來的資料将共同決定傳往MultiBinding目标的資料。
舉例:有如下界面
<StackPanel Background="LightBlue">
<TextBox x:Name="textBox1" Height="23" Margin="5" />
<TextBox x:Name="textBox2" Height="23" Margin="5,0" />
<TextBox x:Name="textBox3" Height="23" Margin="5" />
<TextBox x:Name="textBox4" Height="23" Margin="5" />
<Button x:Name="button1" Content="Submit" Width="80" Margin="5" />
</StackPanel>
背景代碼中設定MultiBinding
Binding b1 = new Binding("Text") { Source = textBox1 };
Binding b2 = new Binding("Text") { Source = textBox2 };
Binding b3 = new Binding("Text") { Source = textBox3 };
Binding b4 = new Binding("Text") { Source = textBox4 };
MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
mb.Bindings.Add(b1);
mb.Bindings.Add(b2);
mb.Bindings.Add(b3);
mb.Bindings.Add(b4);
mb.Converter = new LogonMultiBindingConverter();
button1.SetBinding(Button.IsEnabledProperty, mb);
轉換器由于需要對多個值進行轉換,是以需要使用IMultiValueConverter的派生類進行轉換,轉換器代碼
class LogonMultiBindingConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (!values.Cast<string>().Any(Text => string.IsNullOrEmpty(Text))
&& values[0].ToString() == values[1].ToString()
&& values[2].ToString() == values[3].ToString())
{
return true;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
運作效果如圖

當第一行和第二行的内容相同,并且,第三行和第四行的内容相同時,Submit按鈕可用,否則Submit不可用