我花了很多时间尝试了一些不同的方法来解决我遇到的问题,但无济于事,所以我希望有人可以提供帮助。
我有一个带有双向绑定的文本框元素,它使用类型转换器将字符串中的值转换为自定义数据类型,例如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
我也尝试过使用{{1}},并完全避免使用Type转换器,但这导致了 LOT 的额外代码,并没有真正帮助。我宁愿避免走这条路,因为Type Converter更优雅。
非常感谢任何建议/协助! :)
答案 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);