46

在过去的一年左右的时间里,我看到了许多不同的价值转换器,用于许多不同的目的,来自许多不同的作者。我想到的一件事是它们返回的“默认”值的广泛差异。例如;

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

所以我的问题是,是否有一种“标准”方式来指示输入值无法转换?

4

6 回答 6

34

根据MSDN - IValueConverter

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

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

于 2011-10-10T14:52:17.177 回答
25

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

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

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

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

编辑

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

于 2011-05-13T13:48:57.593 回答
5

经过大量思考和挖掘,似乎DependencyProperty.UnsetValue是合适的选择。我已经成功地将内部的所有东西都转移到了这种模式。此外,本页“备注”部分中的文字表明我这可能是最佳选择。

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

于 2011-10-07T19:23:40.810 回答
2

您默认返回的内容取决于具体情况。您不希望将 int 作为转换器的默认值返回为 bool,或者为可见性枚举的转换器返回 bool。

于 2011-05-13T13:50:17.543 回答
1

通常如果一个值无法转换,我会抛出一个Exception

这是因为如果我尝试使用无效的转换器转换值,我希望收到提醒,以便我可以更改我的代码。

在极少数情况下,即使无法转换一个值也可能是有效的,在这种情况下,我通常返回传递给转换器的相同值。仅当我希望在可能的情况下转换值或保持不变时才使用此选项。

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

我认为我从未返回过您指定的 3 个(nullDependencyProperty.UnsetValueBinding.DoNothing)中的任何一个,因为这些值通常是出乎意料的并且不容易注意到,除非您专门寻找它们。

于 2011-10-07T19:36:18.483 回答
-4

targetType您还可以使用此函数返回一个真正的默认对象:

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

资料来源:C# - default(Type) 的编程等效项

于 2011-05-13T15:03:45.680 回答