gpt4 book ai didi

c# - 默认 IValueConverter

转载 作者:行者123 更新时间:2023-11-30 12:34:00 39 4
gpt4 key购买 nike

我有一个简单的 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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com