WPF进阶之接口(1):IValueConverter,IMultiValueConverter

WPF进阶之接口(1):IValueConverter,IMultiValueConverter2010年10月20日 星期三 11:52看一个例子,FontFamily="Trebuchet MS, GlobalSansSerif.CompositeFont" 。这样一条简单的语句,熟悉WPF的人在xaml中可能经常使用。问题是为什么,WPF能将一个string类型的值,赋值给FontFamily类型。 答案:WPF团队在实现XAML语言的时候,为了使用户能像使用HTML语法一样方便,在WPF中集成了很多的转换器,它们能将String值转化为各种类型,赋值给Control的各个属性。 进一步讨论,本人使用C#4年,WPF3年。个人一点点浅见,MS的WPF的确为用户考虑了很多,原来很多复杂的功能,现在仅仅几条语句就能实现,MS力求用强大的FrameWork,降低对程序员能力的要求(改变过去C++的思路),进而用户在初步接触WPF时有种随心所欲的感觉。但是要记住:凡是越方便的,出了问题后,结果越难查找。例如之前说过的WebBrowser内容不可见的问题(请参看WPF WebBrowser 不可见问题的解析)。 原因在于你不知道MS的很多内部实现原理,当用户习惯方便的使用WPF各种强大功能时,便慢慢养成对一个问题不求甚解的习惯。那么在编程时往往不能实现真正的随心所欲。 进入正题,不就是一个值转换吗,值得展开吗。我认为是值得的。且看一下代码(摘自MSDN): namespace Converter { [ValueConversion(typeof(DateTime), typeof(String))] public class DateConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { DateTime date = (DateTime)value; return date.ToShortDateString(); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { string strValue = value as string; DateTime resultDateTime; if (DateTime.TryParse(strValue, out resultDateTime)) { return resultDateTime; } return DependencyProperty.UnsetValue; } } } Xaml: xmlns:src="clr-namespace:Converter" ................... Start Date: 分析: 在xaml中设置TextBlock Text="{Binding Path=StartDate, Converter={StaticResource dateConverter}}" 其中StartData是后台中的一个属性,类型为任意,当为String是可以直接绑定,当为其他值是就需要Converter来实现转换。这也就是实现IValueConverter的意义。 实现IValueConverter接口主要是 实现 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 其中: Convert实现后台值向UI显示的值 之间的转换 ConvertBack实现UI显示值向后台值 之间的转换。 再来看看IMultiValueConverter,它和IValueConverter类似,不同在于,IMultiValueConverter可实现有几个后台值综合决定前台UI显示的值。 public class DragDropListBox_ViewportSizeConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { double u = 0.12; double ThumbHeight = 94;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值