当UI需要显示的信息由多个数据源来决定的时候就需要使用MultiBinding,即多路Binding。MultiBinding与Binding一样均以BindingBase为基类,也就是说凡是能使用Binding对象的场合都能使用MultiBinding。
MultiBinding具有一个名为Bindings的属性,其类型为Collection<BindingBase>,通过这个属性把一组Binding对象聚合起来,处在这个集合中的Binding对象可以拥有自己的数据校验和转换机制,它们汇集起来的数据将共同决定传往MultiBinding目标的数据。
以用户注册需求为例,UI包括四个TextBox和一个Button,第一、二个TextBox输入用户名,要求内容一致,第三、四个TextBox输入密码,要求内容一致,当TextBox内容完全符合要求时Button才可用。
XAML代码如下:
<Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="210" Width="300"> <StackPanel> <TextBox x:Name="t1" Height="23" Margin="5"></TextBox> <TextBox x:Name="t2" Height="23" Margin="5"></TextBox> <TextBox x:Name="t3" Height="23" Margin="5"></TextBox> <TextBox x:Name="t4" Height="23" Margin="5"></TextBox> <Button x:Name="b1" Content="提交" Height="23" Margin="5"></Button> </StackPanel> </Window>
创建自定义Converter,代码如下:
public class CommitMultiBindingConverter:IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.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[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
设置MultiBinding,代码如下:
public MainWindow() { InitializeComponent(); SetMultiBinding(); } private void SetMultiBinding() { //准备Binding Binding b1 = new Binding("Text") { Source = this.t1 }; Binding b2 = new Binding("Text") { Source = this.t2 }; Binding b3 = new Binding("Text") { Source = this.t3 }; Binding b4 = new Binding("Text") { Source = this.t4 }; //准备MultiBinding 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 CommitMultiBindingConverter(); //将Binding与Button关联 this.b1.SetBinding(Button.IsEnabledProperty, mb); }