Binding有一种机制成为数据转换(Data Convert),当Source端Path所关联数据与Target端目标属性数据类型不一致时,我们可以添加数据转换器(Data Converter)。
手写Converter的方式是创建一个类并让这个类实现IValueConverter接口。IValueConverter接口定义如下:
public interface IValueConverter
{
object Convert(object value, Type targetType, object parameter, CultureInfo culture);
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
}
当数据从Binding的Source流向Target时,Convert方法将被调用;反之,当Binding的Target流向Source时,ConverterBack将被调用。这两个方法的参数列表一模一样:第一个参数是object,最大限度地保证了Converter的重要性(可以在方法体内对实际类型进行判断);第二个参数用于确定方法的返回类型(个人认为形参名字叫outputType比targetType要好,可以避免与Binding的Target混淆);第三个参数用于把额外的信息传入方法,若需要传递多个信息则可以把信息放入一个集合对象来传入方法。
Binding对象的Mode属性会影响到这两个方法的调用。如果Mode为TwoWay或Default行为与TwoWay一致则两个方法都可能被调用;如果Mode为OneWay或Default行为与OneWay一致则可能只有Convert方法会被调用;其他情况同理。
下面的例子是一个Converter的综合实例,程序的用途是在列表中向玩家显示一些军用分级的状态。
首先创建几个自定义数据类型:
public enum Category
{
Bomber,
Fighter
}
public enum State
{
Available,
Locked,
Unknown
}
public class Plane
{
pub