在XAML中每一个元素对象对应一个实例,而实例属性可以通过属性进行赋值。在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使用XAML的类型转换器(Type Converters)。本文将讲解XAML类型转换器的使用。
在Windows 10 UWP应用开发中,经常会用到类型转换器,例如对按钮的内容进行赋值,代码如下:
<Button Content="演示按钮"/>
Button
的Content
属性被赋值为字符串类型“演示按钮”。XAML语法解析器可以将字符串类型转换为对应的.Net类型,然后进行赋值操作。而如果在按钮控件中,添加内容文本颜色属性,
<Button Content="按钮演示" Foreground="Red"/>
在.Net Framework中,Foreground属性的数据类型是Brush,通过SolidColorBrush对Color进行赋值,在以上代码中,XAML语法解析器需要使用类型转换器(Type Converters)将简单文本字符串“Red
”,转换为对应的“Brush”画刷类型,其颜色值为Red=255,Green=0,Blue=0,Aplha=255。 对应后台代码类型转换是:
Button button = new Button { Foreground = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255)) };
这一转换过程是由.Net Framework内置类型转换器实现的,无需开发人员干涉。
转换过程主要是以下两个步骤:
如果以上两个步骤都没有发现对应类型转换器的存在,XAML语法解析器将返回类型错误。 因为XAML支持标记扩展(Markup Extensions),可以在运行时对属性进行赋值,而属性值类型通常需要进行对应的类型转换才能正常使用,所以在实际项目中,经常会用到XAML类型转换器功能,不仅仅局限于项目内置类型转换器,同时还允许开发人员通过继承TypeConverter类创建自定义类型转换器。
下面来看一下如何自定义一个类型转化器
class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value == null)
return Visibility.Visible;
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
if (value == null)
return true;
return ((Visibility)value == Visibility.Visible);
}
}
XAML类型转换器必须实现接口IValueConverter,在Convert
和ConvertBack
中创建转换器逻辑代码。
上面的例子就是将Bool类型
转化为Visibility类型
,以及将Visibility类型
反转为Bool类型
。
<Page.Resources>
<local:BoolToVisibilityConverter x:key = "converter"
</Page.Resources>
<TextBox Visibility = {Binding isShow , Converter={StaticResource converter}} />
使用方法如上,ConvertBack
主要用于双向绑定中,如果没有双向绑定的需求,可以只实现Convert
即可。
在C#代码里面可以这么写
Test test= new Test();
test.isShow = false;
Binding binding = new Binding( "isShow" );
binding.Source = test;
binding.Converter = new BoolToVisibilityConverter();
大家可以动手试试,有什么问题欢迎留言。