从类型转换器访问绑定?

Accessing Binding from Type Converter?

我花了相当多的时间尝试多种不同的方法来解决我遇到的问题,但都无济于事,所以我希望这里有人能提供帮助。

我有一个带有双向绑定的文本框元素,它利用类型转换器将值从字符串转换为自定义数据类型,例如 MyCustomType。这工作正常,但是由于我的项目要求发生变化,我现在需要在进行转换之前执行额外的处理。

但是,为了执行此额外处理,我需要能够访问 "source" 文本框或绑定上下文。我都无法访问。

有什么方法可以从类型转换器的 ConvertFrom() 方法访问源文本框吗?

我尝试使用(通过 WPF)传递给 ConvertFrom() 方法的 ITypeDescriptorContext 参数,但是其中的大多数属性都是空的。

public class MyCustomTypeConverter : TypeConverter
{
   ...
   public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
   {
      // Context is
      return new MyCustomType(value);
   }
   ...
}

我也尝试过使用 MultiValueConverter,并完全避免使用类型转换器,但这导致了 LOT 的额外代码,并没有真正帮助.我宁愿避免走这条路,因为类型转换器要优雅得多。

任何 advice/assistance 将不胜感激! :)

编辑: 我最终改变了执行验证的方式(使用 INotifyDataError 而不是对异常进行验证),并最终重写了 ConvertFrom() 方法,这样我就不需要再访问 TypeDescriptor 的上下文了。

我不建议使用 ConvertFrom() 方法的上下文,因为它(作为私有 属性)不能保证 属性 将来会存在(尽管我没有读过任何支持这一点的东西,最好假设私有属性可以是 removed/renamed 而无需 MS 开发团队通知),并且在设置 属性 时未设置以编程方式赋值,如下所示:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(MyCustomType));
converter.ConvertFrom(mySourceValue);

如果您正在阅读本文并且确实需要访问 context 参数,您可以使用下面我的方法进行操作,风险自负。


我能够通过询问 ValueConverterContext class 并访问私有 _targetElement 字段来解决这个问题,如下所示:

var sourceTextBox = context.GetType().GetField("_targetElement", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context)

仍然感谢您的帮助。 :)

编辑:要访问此文本框的绑定,您只需将 sourceTextBox 转换为 TextBox,然后:

var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty);