首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >默认IValueConverter

默认IValueConverter
EN

Stack Overflow用户
提问于 2011-11-07 12:24:23
回答 2查看 1.1K关注 0票数 5

我有一个简单的IValueConverter,它只使用一个TypeConverter来进行转换。但是,在某些情况下,提供的TypeConverter将失败。

如果Binding没有提供转换器,我想回退到WPF会使用的任何东西。使用反射器,我已经确定存在一个DefaultValueConverter,但它是MS.Internal.Data内部的。

有没有一种简单的方法可以让我拿到DefaultValueConverter或做同样事情的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-07 13:22:29

我看了一下.NET reflector,似乎还没有一个官方的方法来获取默认值转换器。

您需要精确的是调用该方法

代码语言:javascript
复制
internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource);

MS.Internal.Data.DataBindEngine类中。

您将获得使用静态内部属性运行线程的当前DataBindEngine

代码语言:javascript
复制
 internal static DataBindEngine CurrentDataBindEngine

总是在DataBindEngine类中。

问题是这个类是内部的!

我还查看了一下是否存在使用该方法的公共类,但实际上该方法和默认值转换器类(不止一个!)只在内部数据绑定类中使用,所以,没有办法,对不起。

您可以使用反射来访问内部成员,但这将是一个非常糟糕的破解!为此,先访问静态属性DataBindEngine.CurrentDataBindEngine,然后访问方法GetDefaultValueConverter,始终使用反射。使用属性Obsolete :)封装一个静态函数

也许更干净的方法是使用默认的手写转换。

你可以试着理解为什么它会给你带来错误,或者写一段可以处理特殊情况的代码。他们的代码相当复杂和相互关联,我不建议复制他们的代码。

有时候WPF让我很生气,很多与数据绑定相关的东西都是隐藏的,内部的或者不够通用的,这是一个非常糟糕的设计选择,我不明白。

旧的TypeConverter有时就足够了。这取决于你必须做什么。

代码语言:javascript
复制
public static object MyConvert(object value, Type t)
{
    TypeConverter tc = TypeDescriptor.GetConverter(t);
    return tc.ConvertFrom(value);
}

您还可以尝试使用IConvertible的静态方法Convert.ChangeType

我想问题不在于转换你的对象,而在于将它转换成一个依赖属性使用的值(反之亦然)。为此,有一个公共类XamlValueConverter,也由默认值转换器在内部使用。然而,这将会很复杂,所以...对于你的问题不是一个真正简单的解决方案。

正如Merlyn一直说的,我开始相信反射可能是一种更合适的方式。

票数 2
EN

Stack Overflow用户

发布于 2011-11-07 13:26:42

因为DefaultValueConverter是MS.Internal.Data内部的,所以最好是创建您自己版本的默认值转换器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8032717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档