多绑定
Binding 是可用于数据绑定的类之一。BindingBase是所有绑定的抽象基类,有不同的具体实现方式。除了Binding之外还有MultiBinding和PriorityBinding。MultiBinding允许把一个WPF元素绑定到多个源上。例如,Person类有LastName和FirstName属性。把这两个属性绑定到一个wpf元素上会比较有趣:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BooksDemo.Models
{
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
对于MultiBinding,标记扩展不可用------因此必须用XAML元素语法来制定绑定。MulBinding的子元素是指定绑定到各种属性上的Binding元素。之类使用了LastName和FirstName属性。数据上下文用Grid元素设置。以便引用person1资源。
为了把属性连接在一起,MultiBinding使用一个Converter把多个值转换为一个。这个转换器使用一个参数,并可以根据参数进行不同的转换:
<Window.Resources>
<local:Person x:Key="person1" FirstName="Tom" LastName="Turbo" />
<local:PersonNameConverter x:Key="personNameConverter" />
</Window.Resources>
<Grid DataContext="{StaticResource person1}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource personNameConverter}" >
<MultiBinding.ConverterParameter>
<sys:String>FirstLast</sys:String>
</MultiBinding.ConverterParameter>
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBox.Text>
</TextBox>
多只转换器实现IMuitIValueConverter接口。这个接口定义了两个方法:Convert和ConvertBack()。Convert()方法通过第一个参数从数据源中接受多个值,并把一个值返回给目标。在实现代码中根据参数值是FirstName还是LastName,生成不同的结果
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace MultiBindingSample
{
public class PersonNameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
switch (parameter as string)
{
case "FirstLast":
return values[0] + " " + values[1];
case "LastFirst":
return values[1] + ", " + values[0];
default:
throw new ArgumentException($"invalid argument {parameter}");
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
在这个简单的情形中,只把一些字符串与MultiBinding合并起来,并不需要实现IMultiValueConverter,顶一个格式字符串就足够了。用multiBinding定义的格式字符串首先需要一个{}前缀。在XAML中,花括号通常定义一个标记表达式。把{}作用前缀会转义这个符号,,不定义标记表达式,而是表示它后面的是一个通用的字符串。该实例指定,两个Binding元素用一个逗号和一个空白分隔开
<TextBox Grid.Row="1">
<TextBox.Text>
<MultiBinding StringFormat="{}{0}, {1}">
<Binding Path="LastName" />
<Binding Path="FirstName" />
</MultiBinding>
</TextBox.Text>
</TextBox>