WPF 值转换器 - 不可兑换价值的标准回报
本文关键字:标准 回报 转换器 WPF 可兑换 | 更新日期: 2023-09-27 17:56:26
在过去一年左右的时间里,我看到了许多不同的价值转换器,用于许多不同的目的,来自许多不同的作者。 我脑海中突出的一件事是它们返回的"默认"值差异很大。 例如;
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...
}}
所以我的问题是,是否有一种"标准"方法来指示输入值无法转换?
根据 MSDN - IValueConverter:
数据绑定引擎不会捕获由 用户提供的转换器。转换引发的任何异常 方法,或由 转换方法调用被视为运行时错误。处理 通过返回 DependencyProperty.UnsetValue 来预期问题。
关键行是"通过返回 DependencyProperty.UnsetValue 来处理预期的问题"。
当您查找这些值时,您会发现它们的含义。然后选择正确的一个以返回您的转换器。
主要问题是 null 可能是该属性的有效值。
DependencyProperty.UnsetValue 指示该属性存在,但属性系统未设置其值
Binding.DoNothing 指示绑定引擎不要将值传输到绑定目标,不要移动到 PriorityBinding 中的下一个绑定,或者不使用回退值或默认值
编辑
要指示您无法转换该值,您应该简单地返回给定的值。这是您能做的最好的事情,因为它将问题返回给绑定的作者。如果你干涉这个值,就很难找出发生了什么。
经过深思熟虑和挖掘,似乎 DependencyProperty.UnsetValue 是合适的选择。 我已经将内部的所有东西都转移到了这种模式中,并取得了很大的成功。 此外,本页"备注"部分中的文本表明我这可能是最佳选择。
还有一些关于在无法转换绑定时返回输入值的讨论,但这很容易"破坏"绑定系统。 考虑绑定输入是"字符串"而输出是"画笔"的情况。 返回字符串是行不通的!
返回的内容取决于情况。 您不希望将 int 作为布尔值转换器的默认值,或为可见性枚举的转换器返回布尔值。
通常如果一个值无法转换,我会抛出一个Exception
这是因为如果我尝试使用无效转换器转换值,我希望收到警报,以便我可以更改我的代码。
在极少数情况下,即使无法转换值,该值也可能有效,在这种情况下,我通常会返回传递给转换器的相同值。仅当我希望尽可能转换值时,或者如果不希望转换值,则保持不变时,才使用此方法。
我偶尔做的另一个罕见情况是硬编码默认值。这通常是在我知道转换器可能与无效参数一起使用时完成的,并且无论结果如何,我都想返回一个有效的值。我的硬编码默认转换器几乎总是返回布尔值。
我认为我从来没有返回过您指定的 3 个(null
、DependencyProperty.UnsetValue
或 Binding.DoNothing
)中的任何一个,因为这些值通常是出乎意料的,除非您专门查找它们,否则不容易注意到。
您还可以使用此函数返回一个真实的targetType
默认对象:
public static object GetDefault(Type type)
{
if(type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
源:C# - 默认(类型)的编程等效