从类型转换器访问绑定?

时间:2016-04-18 04:08:45

标签: c# wpf typeconverter

我花了很多时间尝试了一些不同的方法来解决我遇到的问题,但无济于事,所以我希望有人可以提供帮助。

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

但是,为了执行此额外处理,我需要能够访问“源”文本框或绑定上下文。我都没能访问过。

有没有办法从Type Converter的ConvertFrom()方法访问源文本框?

我尝试使用ITypeDescriptorContext传递的ConvertFrom()参数到public class MyCustomTypeConverter : TypeConverter { ... public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { // Context is return new MyCustomType(value); } ... } 方法,但其中的大多数属性都是null。

MultiValueConverter

The context within ConvertFrom()

Context - additional properties

我也尝试过使用{{1}},并完全避免使用Type转换器,但这导致了 LOT 的额外代码,并没有真正帮助。我宁愿避免走这条路,因为Type Converter更优雅。

非常感谢任何建议/协助! :)

1 个答案:

答案 0 :(得分:1)

编辑:我最终改变了执行验证的方式(使用INotifyDataError而非验证异常),最后重写了ConvertFrom()方法我的类型转换器,这样我就不再需要访问TypeDescriptor的上下文了。

我不建议使用ConvertFrom()方法中的上下文,因为它(作为私有属性)不能保证该属性将来会存在(虽然我没有读过任何东西来支持它,最好假设可以在没有来自MS开发团队的通知的情况下删除/重命名私有属性),并且在以编程方式设置属性值时不会设置它,如下所示:

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

如果您正在阅读此内容且确实需要访问context参数,则可以使用下面的方法执行此操作,风险自负。

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

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

谢谢你的帮助。 :)

编辑:要访问此TextBox的Bindings,您只需将sourceTextBox转换为TextBox,然后:

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