学校布置的一个作业,需要用到这些知识,刚好我也准备将 MultiBinding 写入博客之中 …
MultiBinding(多路 Binding)
有的时候 UI 要需要显示的信息由不止一个数据来源决定,这时候就需要使用 MultiBinding(多路 Binding)。
MultiBinding 具有一个名为 Bindings 的属性,其类型是 Collection < BindingBase >,通过这个属性 MultiBinding 把一组 Binding 对象聚合起来,它们汇集起来的数据将共同决定传住 MultiBinding 目标的数据。
我们可以通过 转换机制 将它们数据源绑定的数据进行统一性。
MultiBinding 示意图:
实例讲解
我们需要完成一个简单的购票小程序:有各种各样的票、折扣等等 . . .
程序布局:
上面有这许多的 UI元素,其中此文章只讲述我们的主题 —— MultiBinding . . .
我们需要做的事情就是将,“ 应收款 ” 与 “ 购票数量 ” 、“ 票价 ” 相关联。
我会在最后付上程序的效果图 . . .
实现过程:
需要关联的对象:
- 创建 Binding对象:
Binding binding1 = new Binding("Text") { Source = this.numTextBox };
Binding binding2 = new Binding("Text") { Source = this.priceTextBox};
我们将购票数量与票价作为数据源,然后创建 Binding对象
- 创建 MultiBinding对象,并将两个 Binding对象加入其中:
MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
mb.Bindings.Add(binding1);
mb.Bindings.Add(binding2);
需要注意的地方是,使用Add方法时,要注意一下加入的顺序
- 利用 MultiBinding的 Converter,将不同数据源里的 Path进行统一性:
mb.Converter = new LogonMultiBindingConverter();
后面的这个类需要我们自己来实现,它继承一个叫 IMultiValueConverter的接口:
// 两个方法都是通过继承而来
internal class LogonMultiBindingConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
// 定义两个变量用于获取,购票数量与票价的值
double x = 0;
double y = 0;
// 判断两个 TextBox的数据是不是合理的数据,并把它 out 进 x、y
if(double.TryParse(values[0].ToString(),out x) &&
double.TryParse(values[1].ToString(),out y))
{
// 返回它们相乘的结果,用于放进 应收款的 TextBox中
return (x * y).ToString();
}
return ""; // 如果失败就返回空字符串
}
// 用不到
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
- 将 MultiBinding对象 与 应收款对象进行 Binding:
this.gatheringTextBox.SetBinding(TextBox.TextProperty, mb);
到此,此程序 MultiBinding部分的内容已经结束,需要此程序完整源码的可评论:666 . . .
效果演示:
我们发现,应收款已经可以随着 购票数量与票价的变化而变化,实现了 WPF中的 数据驱动 UI的理念 . . .