从类型转换器访问绑定?
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);
我花了相当多的时间尝试多种不同的方法来解决我遇到的问题,但都无济于事,所以我希望这里有人能提供帮助。
我有一个带有双向绑定的文本框元素,它利用类型转换器将值从字符串转换为自定义数据类型,例如 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);