【问题标题】:Accessing Binding from Type Converter?从类型转换器访问绑定?
【发布时间】:2016-04-18 04:08:45
【问题描述】:

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

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

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

有没有办法通过类型转换器的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,并完全避免使用类型转换器,但这会导致很多额外代码,并没有真正帮助。我宁愿避免走这条路,因为类型转换器要优雅得多。

任何建议/帮助将不胜感激! :)

【问题讨论】:

  • 为什么要访问绑定?可能还有其他方法
  • 我认为不可能从 TypeConverters 访问绑定。他们必须在DataLayer上操作,似乎也有很多不必要的工作。如果您更新问题,人们可能会很容易地以这种方式为您提供帮助。
  • @Nitin,我试图访问源文本框,以便可以将其传递给另一个方法(作为参考),以便在验证失败时执行特定任务。这不一定是最好的方法,但是项目的需求在开发阶段已经发生了相当大的变化,这是一个功能性的、有点临时的解决方案。 (当我有时间时,它在我要重构的事情清单上相当高)。谢谢你们的回复。

标签: c# wpf typeconverter


【解决方案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)

仍然感谢您的帮助。 :)

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

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

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2012-04-06
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    相关资源
    最近更新 更多