WPF ValueConverter - 不可转换价值的标准回报

A.R*_*.R. 43 c# wpf ivalueconverter valueconverter

在过去一年左右的时间里,我看到许多不同的价值转换器出于许多不同的目的,来自许多不同的作者.在我的脑海中突出的一件事是它们返回的"默认"值的广泛变化.例如;

  public class MyConverter: IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      // OK, we test for some undesirable, unconvertable situation, typically null...
      if (value == null)
      {
        // And here are a variety of 'defaults' that I have seen, these begin the most typical.
        return null;
        return DependencyProperty.UnsetValue;
        return Binding.DoNothing;
      }
        //...... other code.. whatever...
}}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是否有一种"标准"方式来表明输入值无法转换?

m-y*_*m-y 28

根据MSDN - IValueConverter:

数据绑定引擎不会捕获用户提供的转换器抛出的异常.Convert方法抛出的任何异常,或Convert方法调用的方法抛出的任何未捕获的异常都被视为运行时错误.通过返回DependencyProperty.UnsetValue处理预期的问题.

关键是通过返回DependencyProperty.UnsetValue处理预期的问题.

  • @bitbonk:看到这个答案:http://stackoverflow.com/a/10385121/347172 ...基本上,`Binding.DoNothing`在其轨道中停止绑定引擎,而`DependencyProperty.UnsetValue`告诉绑定引擎使用反而是FallbackValue. (7认同)
  • 但是`DependencyProperty.UnsetValue`和`Binding.DoNothing`之间的实际**实际区别是什么?这里的文档并不是很清楚.在这两种情况下,绑定引擎以何种方式表现不同? (3认同)

Ern*_*rno 23

当您查看这些值时,您将发现它们的含义.然后选择正确的一个返回转换器.

主要问题是null可能是属性的有效值.

DependencyProperty.UnsetValue指示属性存在,但没有由属性系统设置其值

Binding.DoNothing指示绑定引擎不将值传递给绑定目标,不移动到PriorityBinding中的下一个绑定,或者不使用FallBackValue或默认值

编辑

要表明您无法转换该值,您应该只返回给定的值.这是您可以做的最好的,因为它将问题返回给绑定的作者.如果你干涉价值,就很难找到正在发生的事情.

  • +1用于返回DependencyProperty.UnsetValue.如果这样做,WPF会显示验证错误,错误消息为"值'...'无法转换".正是我在寻找什么.虽然只是返回未转换的值时WPF的行为相同. (2认同)

A.R*_*.R. 5

经过深思熟虑和挖掘,似乎DependencyProperty.UnsetValue是合适的选择.我把所有内容都移到了这个模式上并取得了很大的成功.此外,本页 "备注"部分中的文字表明我可能是最佳选择.

如果无法转换绑定,还有一些关于返回输入值的讨论,但这很容易"破坏"绑定系统.想想绑定输入是'字符串'并且输出是'画笔'的情况.返回一个字符串是行不通的!