Default IValueConverter

本文关键字:IValueConverter Default | 更新日期: 2023-09-27 18:13:44

我有一个简单的IValueConverter,它只使用TypeConverter来进行转换。然而,在某些情况下,TypeConverter将失效。

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

有一个简单的方法,我可以得到我的手在DefaultValueConverter或做同样的事情吗?

Default IValueConverter

我看了一下。net反射器,似乎没有一个官方的方法来获得默认值转换器。

你需要精确地调用方法

internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource);

MS.Internal.Data.DataBindEngine

使用静态内部属性

获取正在运行的线程的当前DataBindEngine
 internal static DataBindEngine CurrentDataBindEngine

总是在DataBindEngine类中。

问题是类是内部的!

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

你可以使用反射来访问内部成员,但这将是一个非常糟糕的肮脏的hack!要做到这一点,请访问静态属性DataBindEngine。CurrentDataBindEngine,然后,访问GetDefaultValueConverter方法,总是带反射。在静态函数中使用属性[已废弃]:)

可能更简洁的方法是使用默认的手写转换。

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

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

旧的TypeConverter有时就足够了。这取决于你要做什么。
public static object MyConvert(object value, Type t)
{
    TypeConverter tc = TypeDescriptor.GetConverter(t);
    return tc.ConvertFrom(value);
}

您也可以尝试与IConvertible一起工作的静态方法Convert.ChangeType

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

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

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