有时候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不可用