由于XAML是基于文本格式,因此string类型的属性,比较适合,并且XAML语言也确实这样做的。
<Rectangle
Width="200"
Height="40"
Stroke="Black"
Fill="Red"
/>
但是,Width和Height是Double类型,Stroke和Fill是Brush类型,他们是如何转换成相对应的类型,并编译的那?答案是TypeConverter类型转换系统,它实现了string类型与源类型之间的转换。
Width和Height属性使用LengthConverter类型转换
Brush属性使用BrushConverter类型转换
例如
从Color类型转换为SolidColorBrush。
[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Color color = (Color)value;
return new SolidColorBrush(color);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
然后我们可以在资源中定义一个ColorBrushConverter 实例(src是一个自定义命名空间,引入了ColorBrushConverter 类所在的Assembly)。
<Application.Resources>
<src:ColorBrushConverter x:Key="ColorToBrush"/>
</Application.Resources>
最后使用这个自定义的类型转换器:
<DataTemplate DataType="{x:Type Color}">
<Rectangle Height="25" Width="25" Fill="{Binding Converter={StaticResource ColorToBrush}}"/>
</DataTemplate>
自定义类型转换器,参见http://msdn.microsoft.com/zh-cn/library/bb546926(v=vs.90).aspx