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 class DictionaryItemConverter : IValueConverter

{

public string ValueType { getset; }

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的区别很有帮助。

posted @ 2010-05-03 21:39  Leepy  阅读(1803)  评论(1编辑  收藏  举报