c# – 默认IValueConverter

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

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

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

最佳答案 我看了一下.NET反射器,似乎没有官方的方法来获得默认值转换器.

你需要准确的是调用方法

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,默认值转换器也在内部使用.
然而,这将变得复杂,所以…不是解决问题的真正简单方法.

正如梅林所说,我开始相信反思可能是更合适的方式.

点赞