Silverlight 中 IValueConverter 与 TypeConverter 的区别
翻译的原文出处:http://bryantlikes.com/SilverlightIValueConverterVsTypeConverter.aspx
这两个东西对于我们来说不是很清晰,所以我决定写篇博客来介绍下它们。IValueConverters 和 TypeConverters 都用于转换,但是它们是不同的概念。
TypeConverters用于Xaml解析器将xaml文档中的数据转换为CLR对象中的数据,所以当你设置Height=”100”的时候,高度显然不能够作为一个字符串,必须把它转换为double类型。这就需要一个类型转换器,类型转换器也是单向的,一旦从xaml被转换到CLR的值是无法反向的,自定义的类型转换器必须定义在类上否则Xaml解析器无法知道怎么去解析该值。这里有一篇很好的文章介绍了更详细的信息。
IValueConverters用于在数据绑定方面。通常它们在xaml文件中作为一个静态资源被创建,然后再在绑定中进行引用。相比于类型转换器,值转换器可以进行双向绑定。值转换器可以更加动态地指定在绑定上,而类型转换器做不到。值转换器也更加灵活,它可以通过转换参数ConverterParameter传递参数值。你也可以读这篇文章来了解你所兴趣的。
一个很好的例子是出现在这个Silverlight论坛的问题,怎样让Silverlight的值转换器更易扩展。Odegaard(人名)试着绑定一个Dictionary对象,获取键值中的一个并正确地显示在TextBlock上。可是即使WPF支持这种属性包类型的绑定,在Silverlight没有办法直接实现。这里你需要一个IValueConverter。在这种情况下,值转换器在字典中得到键值并且返回对于的值。你可以看下这段代码(尽管问题并不像我实现的那样,因为问题太复杂了,我想我还是弄个简单些的)
我试着找出一个为类型字典更加通用的做法,但是我所能做的最好的办法是值类型已经被分配,但键值仍然必须是一个字符串。
{
public string ValueType { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Type generic = typeof(Dictionary<,>);
Type[] typeArgs = new Type[] { typeof(string), Type.GetType(ValueType) };
Type dictType = generic.MakeGenericType(typeArgs);
if (dictType.IsInstanceOfType(value))
{
return dictType.GetMethod("get_Item").Invoke(value, new object[] { parameter });
}
throw new InvalidCastException(string.Format("Dictionary is not of type Dictionary<stirng,{0}>.", ValueType));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
所以这对于你理解IValueConverters与TypeConverter的区别很有帮助。