我有一个简单的IValueConverter,它只使用一个TypeConverter来进行转换。但是,在某些情况下,提供的TypeConverter将失败。
如果Binding没有提供转换器,我想回退到WPF会使用的任何东西。使用反射器,我已经确定存在一个DefaultValueConverter,但它是MS.Internal.Data内部的。
有没有一种简单的方法可以让我拿到DefaultValueConverter或做同样事情的东西?
发布于 2011-11-07 13:22:29
我看了一下.NET reflector,似乎还没有一个官方的方法来获取默认值转换器。
您需要精确的是调用该方法
internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource);在MS.Internal.Data.DataBindEngine类中。
您将获得使用静态内部属性运行线程的当前DataBindEngine
internal static DataBindEngine CurrentDataBindEngine总是在DataBindEngine类中。
问题是这个类是内部的!
我还查看了一下是否存在使用该方法的公共类,但实际上该方法和默认值转换器类(不止一个!)只在内部数据绑定类中使用,所以,没有办法,对不起。
您可以使用反射来访问内部成员,但这将是一个非常糟糕的破解!为此,先访问静态属性DataBindEngine.CurrentDataBindEngine,然后访问方法GetDefaultValueConverter,始终使用反射。使用属性Obsolete :)封装一个静态函数
也许更干净的方法是使用默认的手写转换。
你可以试着理解为什么它会给你带来错误,或者写一段可以处理特殊情况的代码。他们的代码相当复杂和相互关联,我不建议复制他们的代码。
有时候WPF让我很生气,很多与数据绑定相关的东西都是隐藏的,内部的或者不够通用的,这是一个非常糟糕的设计选择,我不明白。
旧的TypeConverter有时就足够了。这取决于你必须做什么。
public static object MyConvert(object value, Type t)
{
TypeConverter tc = TypeDescriptor.GetConverter(t);
return tc.ConvertFrom(value);
}您还可以尝试使用IConvertible的静态方法Convert.ChangeType。
我想问题不在于转换你的对象,而在于将它转换成一个依赖属性使用的值(反之亦然)。为此,有一个公共类XamlValueConverter,也由默认值转换器在内部使用。然而,这将会很复杂,所以...对于你的问题不是一个真正简单的解决方案。
正如Merlyn一直说的,我开始相信反射可能是一种更合适的方式。
发布于 2011-11-07 13:26:42
因为DefaultValueConverter是MS.Internal.Data内部的,所以最好是创建您自己版本的默认值转换器
https://stackoverflow.com/questions/8032717
复制相似问题