我有一个简单的IValueConverter,只使用 aTypeConverter来进行转换。然而,在某些情况下,所TypeConverter提供的将失败。
Binding如果没有提供转换器,我想回退到 WPF 会使用的任何内容。使用反射器我已经确定有一个DefaultValueConverter但它是内部的MS.Internal.Data。
有没有一种简单的方法可以让我得到一个DefaultValueConverter或一些可以做同样事情的东西?
我用 .NET Reflector 查看了一下,似乎没有官方的方法来获取默认值转换器。
你需要精确的是调用该方法
internal IValueConverter GetDefaultValueConverter(Type sourceType, Type targetType, bool targetToSource);
Run Code Online (Sandbox Code Playgroud)
在班上MS.Internal.Data.DataBindEngine。
您将获得用于运行具有静态内部属性的线程的当前 DataBindEngine
internal static DataBindEngine CurrentDataBindEngine
Run Code Online (Sandbox Code Playgroud)
始终在 DataBindEngine 类中。
问题是该类是内部的!
我还环顾四周,看看是否有一些公共方法使用该方法,但实际上该方法和默认值转换器类(有多个!)仅在内部数据绑定类中使用,所以,没有出路,抱歉。
您可以使用反射来访问内部成员,但这将是一个非常糟糕的肮脏黑客!为此,请访问静态属性 DataBindEngine.CurrentDataBindEngine,然后访问方法 GetDefaultValueConverter(始终使用反射)。用属性 [Obsolete] 包装在静态函数中:)
可能更简洁的方法是仅使用默认的手写转换。
您可以尝试理解为什么它会给您带来错误,或者编写可以处理特殊情况的代码。他们的代码相当复杂且相互关联,我不建议复制他们的代码。
有时 WPF 让我很生气,很多与数据绑定相关的东西都是隐藏的、内部的或不够通用,这是一个非常糟糕的设计选择,我不明白。
旧的 TypeConverter 有时就足够了。这取决于你必须做什么。
public static object MyConvert(object value, Type t)
{
TypeConverter tc = TypeDescriptor.GetConverter(t);
return tc.ConvertFrom(value);
}
Run Code Online (Sandbox Code Playgroud)
Convert.ChangeType您还可以尝试适用于 的静态方法IConvertible。
我想问题不在于转换您的对象,而是将其转换为依赖属性使用的值(反之亦然)。为此,有一个公共类XamlValueConverter,默认值转换器也在内部使用。然而,这会很复杂,所以......这并不是解决您的问题的真正简单的解决方案。
正如梅林一直说的那样,我开始相信反思可能是一种更合适的方式。