不实现IValueConvert.ConvertBack时的最佳实践

时间:2008-11-05 15:37:41

标签: wpf data-binding

只是想知道在实现没有有意义的ConvertBack实现的IValueConverter时(或者只是用作OneWay的实现),人们认为最佳做法是什么?

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

思想?

4 个答案:

答案 0 :(得分:43)

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

  

数据绑定引擎无法捕获   a引发的异常   用户提供的转换器。任何例外   这是由ConvertBack抛出的   方法,或任何未捕获的异常   通过方法抛出的   ConvertBack方法调用被处理   作为运行时错误。处理预期   返回的问题   DependencyProperty.UnsetValue。

答案 1 :(得分:8)

根据Microsoft的说法,您应该返回DependencyProperty.UnsetValue

答案 2 :(得分:3)

当ConvertBack不包含任何功能,并且不期望调用它时,抛出NotImplementedException。它不应该被调用,因此你想要一个运行时异常。

如果转发故意转换,那么您最好为其提供一个实现。一个选项是返回DependencyProperty.UnsetValue,或者通过返回DependencyProperty.UnsetValue来处理ConvertBack实现中的异常。

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

答案 3 :(得分:2)

我同意@Todd White的回答。

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

从技术上讲,您也不必覆盖Convert;但它必须在ConverterBase中实现,因为它实现了IValueConverter接口的所有方法。在实践中,您每次都会覆盖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();
    }
}