首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从类型转换器访问绑定?

从类型转换器访问绑定?
EN

Stack Overflow用户
提问于 2016-04-18 04:08:45
回答 1查看 312关注 0票数 0

我花了相当长的时间尝试了许多不同的方法来解决我正在解决的问题,但没有结果,所以我希望这里的人能帮上忙。

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

然而,为了执行这个额外的处理,我需要能够访问“源”文本框或绑定上下文。这两件事我都无法进入。

是否有任何方式访问源文本框,从类型转换器的ConvertFrom()方法?

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

代码语言:javascript
复制
public class MyCustomTypeConverter : TypeConverter
{
   ...
   public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
   {
      // Context is
      return new MyCustomType(value);
   }
   ...
}

我也尝试过使用MultiValueConverter,并且完全避免使用Type转换器,但是这导致了一个额外代码的批量,并没有真正的帮助。我宁愿避免沿着这条路走,因为Type转换器要优雅得多。

如有任何意见或协助,不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 07:28:19

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

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

代码语言:javascript
复制
TypeConverter converter = TypeDescriptor.GetConverter(typeof(MyCustomType));
converter.ConvertFrom(mySourceValue);

如果您正在阅读这篇文章,并且确实需要访问context参数,那么您可以使用下面的方法进行访问,这是您自己的风险。

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

代码语言:javascript
复制
var sourceTextBox = context.GetType().GetField("_targetElement", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context)

尽管如此,还是谢谢你的帮助。:)

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

代码语言:javascript
复制
var BindingExpression = sourceTextBox.GetBindingExpression(TextBox.TextProperty);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36685320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档