单值转换器:多值转换器:
WPF、Silverlight及Windows Phone程序开发中往往需要将绑定的数据进⾏特定转换,⽐如DateTime类型的时间转换为yyyyMMdd的⽇期,再如有⼀个值是根据另外多组值的不同⽽异的,此时我们就需要定制⾃⼰的Converter。.Net Framework提供了两种Converter接⼝,单值转换的接⼝IValueConverter和多值转换的接⼝IMultiValueConverter,它们都属于System.Windows.Data命名空间,在程序集
PresentationFramework.dll中。这两种值转换器都是分区域性的。其中⽅法Convert和ConvertBack都具有指⽰区域性信息的culture参数。如果区域性信息与转换⽆关,那么在⾃定义转换器中可以忽略该参数。
单值转换器
将单⼀值转换为特定类型的值,以⽇期转换为例如下:
1、定制DateConverter类,其中当值从绑定源传播给绑定⽬标时,调⽤⽅法Convert。
1 public class DateConverter : IValueConverter 2 {
3 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 4 {
5 return ((DateTime)value).ToString(\"yyyy/MM/dd\"); 6 } 7
8 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 9 {
10 return null;11 }12 }
当值从绑定⽬标传播给绑定源时,调⽤此⽅法ConvertBack,⽅法ConvertBack的实现必须是⽅法Convert的反向实现。例如下:
1 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 2 {
3 DateTime date = (DateTime)value; 4 return date.ToShortDateString(); 5 } 6
7 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 8 {
9 string strValue = value as string;10 DateTime resultDateTime;
11 if (DateTime.TryParse(strValue, out resultDateTime))12 {
13 return resultDateTime;14 }
15 return DependencyProperty.UnsetValue;16 }
返回值DependencyProperty.UnsetValue表⽰转换器没有⽣成任何值。但是通常情况下⽅法ConvertBack没有⽅法Convert常⽤,这⾥不做过多介绍。
2、在xmal⽂件引⽤DateConverter类所在命名空间。
1 xmlns:cvt=\"clr-namespace:ValueConverterDemo.Converter\"
3、在xaml⽂件添加Resources。
1 2
4、在xaml⽂件中指定Binding值的Converter
1 Text=\"{Binding CurrentDate, Converter={StaticResource cvtDate}}\"
效果如下图,图中“时间”是未经过转换的原始DateTime类型,“⽇期”经过转换处理后只显⽰⽇期部分。
多值转换器
将多组值转换为特定类型的值,以纵横流量影响交通指⽰灯颜⾊的变化为例如下:
当纵向流量⼤于横向流量时指⽰灯应为绿⾊,当纵向流量⼩于横向流量时指⽰灯应为红⾊,否则指⽰灯为黄⾊。
1、定制ColorConverter类,此时Convert中参数是object[] values,values[0]对应MultiBinding中的第⼀个Binding值,这⾥是纵向流量值,依此类推,可以在MultiBinding对象中指定多个绑定。
1 public class ColorConverter : IMultiValueConverter 2 {
3 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 4 {
5 double verValue = (double)values[0]; 6 double horValue = (double)values[1]; 7 if (verValue > horValue) 8 {
9 return new SolidColorBrush(Colors.Green);10 }
11 else if (verValue < horValue)12 {
13 return new SolidColorBrush(Colors.Red);14 }
15 return new SolidColorBrush(Colors.Yellow);16 }17
18 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)19 {
20 return null;21 }22 }
2、3步同单值转换。
4、xmal⽂件中指定定制的Converter,此时需要使⽤的MultiBinding来指定多组Binding。
1
效果如下图交通灯的颜⾊是根据纵向流量和横向流量的关系⽽变化的。
纵向流量⼤于横向流量
纵向流量⼩于横向流量
纵向流量等于横向流量
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务