c# - 默认 IValueConverter

标签 c# wpf

我有一个简单的 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 类中。

问题是这个类是内部的!

我也环顾四周,看看是否有一些 public 使用该方法,但实际上该方法和默认值转换器类(不止一个!)仅在内部数据绑定(bind)类中使用,所以,没办法出去,对不起。

您可以使用反射来访问内部成员,但这将是一个非常糟糕的肮脏黑客! 为此,访问静态属性 DataBindEngine.CurrentDataBindEngine,然后访问方法 GetDefaultValueConverter,始终使用反射。 用属性 [Obsolete] 包裹在一个静态函数中 :)

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

您可以尝试理解为什么会出错,或者编写可以处理特殊情况的代码。他们的代码比较复杂,环环相扣,不建议抄袭他们的代码。

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

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

public static object MyConvert(object value, Type t)
{
    TypeConverter tc = TypeDescriptor.GetConverter(t);
    return tc.ConvertFrom(value);
}

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

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

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

关于c# - 默认 IValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032717/

相关文章:

wpf - 我的数据绑定(bind)在控件加载之前没有被评估,我在控件加载后得到属性更改事件,为什么?

wpf - MVVM-如何绑定(bind)到文本框的 SelectionStart 和 SelectionLength 属性?

C# WPF 数据网格转换器

c# - BinaryFormatter.Serialize( Image ) - ExternalException - GDI+ 中发生一般错误

c# - ASP.NET Core 中枚举的自定义验证器

C# 自定义属性未应用

c# - WPF 应用程序不在另一台计算机上运行

c# - 在 Silverlight 中同步操作

c# - 无法动态更改 SkinID 属性

Wpf 样式和附加属性