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( null
, DependencyProperty.UnsetValue
,或Binding.DoNothing
),因为这些值往往是意想不到,不容易注意,除非你专门找他们。
你也可以使用这个函数返回一个真正的targetType
默认对象:
public static object GetDefault(Type type) { if(type.IsValueType) { return Activator.CreateInstance(type); } return null; }
来源: C# – 相当于程序devise的默认(Type)