数据绑定(十一)多路绑定MultiBinding

有时候UI要显示的信息又不止一个数据来源决定,就需要使用MultiBinding,MultiBinding具有一个名为Bindings的属性,其类型是Collection<BindingBase>,通过这个属性MultiBinding把一组Binding对象聚合起来,处在这个集合中的Binding对象可以拥有自己的数据校验与转换机制,它们汇集起来的数据将共同决定传往MultiBinding目标的数据。

举例:有如下界面

 

[html] view plain copy
 
  1. <StackPanel Background="LightBlue">  
  2.     <TextBox x:Name="textBox1" Height="23" Margin="5" />  
  3.     <TextBox x:Name="textBox2" Height="23" Margin="5,0" />  
  4.     <TextBox x:Name="textBox3" Height="23" Margin="5" />  
  5.     <TextBox x:Name="textBox4" Height="23" Margin="5" />  
  6.     <Button x:Name="button1" Content="Submit" Width="80" Margin="5" />  
  7. </StackPanel>  


后台代码中设置MultiBinding

 

[csharp] view plain copy
 
  1. Binding b1 = new Binding("Text") { Source = textBox1 };  
  2. Binding b2 = new Binding("Text") { Source = textBox2 };  
  3. Binding b3 = new Binding("Text") { Source = textBox3 };  
  4. Binding b4 = new Binding("Text") { Source = textBox4 };  
  5.   
  6. MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };  
  7. mb.Bindings.Add(b1);  
  8. mb.Bindings.Add(b2);  
  9. mb.Bindings.Add(b3);  
  10. mb.Bindings.Add(b4);  
  11. mb.Converter = new LogonMultiBindingConverter();  
  12. button1.SetBinding(Button.IsEnabledProperty, mb);  

转换器由于需要对多个值进行转换,所以需要使用IMultiValueConverter的派生类进行转换,转换器代码

 

 

[csharp] view plain copy
 
  1. class LogonMultiBindingConverter : IMultiValueConverter  
  2. {  
  3.     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)  
  4.     {  
  5.         if (!values.Cast<string>().Any(Text => string.IsNullOrEmpty(Text))   
  6.             && values[0].ToString() == values[1].ToString()   
  7.             && values[2].ToString() == values[3].ToString())  
  8.         {  
  9.             return true;  
  10.         }  
  11.   
  12.         return false;  
  13.     }  
  14.   
  15.     public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)  
  16.     {  
  17.         throw new NotImplementedException();  
  18.     }  
  19. }  


运行效果如图

 

当第一行和第二行的内容相同,并且,第三行和第四行的内容相同时,Submit按钮可用,否则Submit不可用

posted on 2017-07-26 09:20  alex5211314  阅读(212)  评论(0编辑  收藏  举报

导航