2008-11-05 55 views
28

只是想知道当实现一个没有有意义的ConvertBack实现(或一个只用作OneWay的)的IValueConverter时,人们认为什么是最佳实践?最佳实践时不执行IValueConvert.ConvertBack

它应该抛出(并在这种情况下是什么例外),返回null或返回一些默认值。

想法?

回答

40

IValueConverter.ConvertBack的MSDN文档建议返回DependencyProperty.UnsetValue

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

4

据微软,你应该返回DependencyProperty.UnsetValue

3

当ConvertBack不包含的功能,而你没想到它被调用,抛出一个NotImplementedException。它不应该被调用,因此你想要一个运行时异常。

如果ConvertBack是故意调用,那么您最好提供一个实现。一种选择是返回DependencyProperty.UnsetValue,或者通过返回DependencyProperty.UnsetValue来处理您的ConvertBack实现中的异常。

我给这理由是:返回DependencyProperty.UnsetValue而不是抛出一个NotImplementedException使得不明显时,当你真的从未想过这是一个ConvertBack方法被调用。也许它应该有一些功能,现在它被调用并抛出运行时异常。如果它只是返回DependencyProperty.UnsetValue,那么发现缺少的ConvertBack功能将会困难得多。

+4

如果你打算这样做,你应该使用`NotSupportedException`,`NotImplementedException`用于当前没有实现的功能,但将会是。 – Lukazoid 2012-07-20 10:50:40

2

我同意@Todd White的回答。

此外,为了节省时间,您可以实现基类转换器类,它为您实现了ConvertBack,因此您不必每次都保存重复的代码就可以实现它。

从技术上讲,您不必覆盖Convert;但它必须在ConverterBase中实现,因为它实现了接口的所有方法。在实践中,您每次都会覆盖Convert,大多数时候可以忽略ConvertBack

public class ConverterBase : IValueConverter 
{ 
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 
    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 
} 

public class VisibilityConverter : ConverterBase 
{ 
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((bool)value^(parameter as bool? == true)).ToVisibility(); 
    } 
}