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

sor*_*rke 33 data-binding wpf

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

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

思考?

Tod*_*ite 45

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

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


Tam*_*mir 8

根据微软的说法,你应该回来 DependencyProperty.UnsetValue


byt*_*e77 6

我同意@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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*lly 5

当 ConvertBack 不包含任何功能,并且您不希望它被调用时,抛出 NotImplementedException。它不应该被调用,因此您需要运行时异常。

如果有意调用ConvertBack ,则最好为其提供实现。一种选择是仅返回 DependencyProperty.UnsetValue,或通过返回 DependencyProperty.UnsetValue 来处理 ConvertBack 实现中的异常。

我对此的理由是:返回一个 DependencyProperty.UnsetValue 而不是抛出 NotImplementedException 使得它在调用 ConvertBack 方法时并不明显,而你真的不打算这样做。也许它现在应该有一些功能,因为它正在被调用并抛出运行时异常。如果它只是返回 DependencyProperty.UnsetValue,那么发现缺少的 ConvertBack 功能会困难得多。

  • 如果你打算这样做,你应该使用 `NotSupportedException`,`NotImplementedException` 用于当前尚未实现但将实现的功能。 (7认同)