初学者。博客仅做个人的理解整理,不到位的地方欢迎大佬们指出,感谢。
1.类型转换器 TypeConverter
1.1类型转换器是用来干什么的?
在xaml中给控件的属性赋值,后台代码解析这个值并赋值给控件的对应的属性(这个属性肯定是依赖属性了)
如在xaml中写:
<Border BorderBrush="Red" BorderThickness="3">
xaml里面 BorderBrush的数据是一个字符串类型的,那控件的这个颜色为啥会显示红色,因为有个类型转换器,把string类型,转换成了Brush类型
xaml里面BorderThickness的数据是一个字符串类型的,也会有一个类型转换器把它转换成Thickness类型。
只不过这些转换器都是默认有的,如果我自定义了一个类型,就没法自动转换,这时候就需要自己写一个类型转换器了
到这里应该明白:
1.xaml中属性的数据是字符串类型,需要把它转换成控件需要的类型
2.类型可以是基础类型:int double这种,也可以是一个对象类型:Brush、Thickness、Color等
3.类型转换器是用在依赖属性上的,因为要绑定。
4.
xaml里面写的数据先经过类型转换器把数据转换好,再赋值给依赖属性
1.2.如何定义?
定义一个新类型(对象):
public class NewType { public double width { get; set; } public double height { get; set; } }
定义类型转换器,继承Type Converter
定义一个新类型NewType的依赖属性:
在哪里引用类型转换器?
通过特性在新类型上用
[TypeConverter(typeof(类型转换器的名字))]
//定义新类型
举个例子:定义一个usercontrol,放一个button,然后在依赖属性上同时设置button的长和宽
运行:
2.值转换器 IValueConverter
2.1 什么是 单值IValueConverter 多值IMultiValueConverter
用在binding表达式中,当目标和源数据进行绑定时,两边类型可能不同,这时候需要值转换器,比如 background属性绑定了一个string数据,无法自己 转换的,就要自己处理值转换器
2.2 如何定义
新建类,继承IValueCOnverter,并实现2个接口:
从源数据到界面
Convert
从界面到数据源
ConvertBack
单值和多值转换器都是这2个接口
public class SingleIvalueConverter : IValueConverter public class MyMultiValueConverter : IMultiValueConverter
2.3如何使用
在xaml中定义值转换器,并指定key
<Window.Resources> <convert:SingleIvalueConverter x:Key="convert1"/> <convert:MyMultiValueConverter x:Key="convert2"/> </Window.Resources>
在目标属性的binding表达式中引用
<TextBox Name="tb" Text="{Binding test,Converter={StaticResource convert1}}"/>
多值转换器的引用
<TextBox Name="tb1" Text="1"/> <TextBox Name="tb2" Text="2"/> <TextBox > <TextBox.Text> <MultiBinding Converter="{StaticResource convert2 }"> <Binding Path="Text" ElementName="tb1"/> <Binding Path="Text" ElementName="tb2"/> </MultiBinding> </TextBox.Text> </TextBox>
单值转换器
多值转换器
3.TypeConvert和IValueConverter的区别
TypeCOnvert是从xaml中的数据到一个依赖属性上时,需要解析采用,如margin=“10,20,30,40”,会解析字符串,传递给对应的属性,不能从属性向xaml传,
IValureConverter是绑定的两端,需要互相转换时用,绑定数据源可以是后台数据,也可以是控件的属性