WPF 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... }} 

所以我的问题是,有没有一个“标准”的方式来表明input值不能被转换?

根据MSDN – IValueConverter :

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

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

当你看这些值,你会发现他们的意思。 然后select正确的一个返回到您的转换器。

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

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

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

编辑

为了表明你不能转换的价值,你应该简单地返回给定的价值。 这是你可以做的最好的,因为它将问题返回给绑定的作者。 如果干涉价值,就很难找出发生的事情。

经过多方思考和挖掘,似乎DependencyProperty.UnsetValue是合适的select。 我已经把所有的东西都搬到了这个模式上,取得了很大的成功。 此外, 本页的“备注”部分的文字表明,我可能是最好的select。

还有一些关于如果绑定无法被转换时返回input值的讨论,但这可以很容易地“打破”绑定系统。 想一下绑定input是“string”,输出是“笔刷”的情况。 返回一个string是不行的!

你作为默认返回什么取决于情况。 您不希望将int作为转换器的默认值返回到布尔值,或者为可见性枚举返回转换器的布尔值。

通常如果一个值不能被转换,我会抛出一个Exception

这是因为如果我试图使用无效的转换器转换值,我想提醒它,所以我可以改变我的代码。

在极less数情况下,即使无法转换,值也可能有效,在这种情况下,我通常会返回传递给转换器的相同值。 这只有在我希望如果可能的情况下要转换的值的情况下才会使用,或者如果不是,则保持不变。

我偶尔做的另一个罕见的情况是硬编码的默认值。 当我知道Converter可能与一个无效的参数一起使用时,通常会这样做,并且无论结果如何,我都希望返回一个有效的值。 我硬编码的默认转换器几乎总是返回布尔值。

我不认为我曾经返回任何你指定的3( nullDependencyProperty.UnsetValue ,或Binding.DoNothing ),因为这些值往往是意想不到,不容易注意,除非你专门找他们。

你也可以使用这个函数返回一个真正的targetType默认对象:

 public static object GetDefault(Type type) { if(type.IsValueType) { return Activator.CreateInstance(type); } return null; } 

来源: C# – 相当于程序devise的默认(Type)