【发布时间】:2010-09-20 21:35:34
【问题描述】:
只是想知道人们在实现没有有意义的 ConvertBack 实现(或仅用作 OneWay 的)的 IValueConverter 时认为最佳实践是什么?
它应该抛出(以及在那种情况下是什么异常),返回 null 还是返回一些默认值。
想法?
【问题讨论】:
标签: wpf data-binding
只是想知道人们在实现没有有意义的 ConvertBack 实现(或仅用作 OneWay 的)的 IValueConverter 时认为最佳实践是什么?
它应该抛出(以及在那种情况下是什么异常),返回 null 还是返回一些默认值。
想法?
【问题讨论】:
标签: wpf data-binding
IValueConverter.ConvertBack 的文档建议返回 DependencyProperty.UnsetValue。
数据绑定引擎不捕获 抛出的异常 用户提供的转换器。任何例外 ConvertBack 抛出的 方法,或任何未捕获的异常 由方法抛出的 ConvertBack 方法调用,被处理 作为运行时错误。处理预期 返回问题 DependencyProperty.UnsetValue.
【讨论】:
根据微软的说法,你应该返回DependencyProperty.UnsetValue
【讨论】:
我同意@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();
}
}
【讨论】:
当 ConvertBack 不包含任何功能并且您不希望调用它时,抛出 NotImplementedException。它不应该被调用,因此你需要一个运行时异常。
如果 ConvertBack 是有意被调用的,那么你最好为它提供一个实现。一种选择是仅返回 DependencyProperty.UnsetValue,或通过返回 DependencyProperty.UnsetValue 在您的 ConvertBack 实现中处理异常。
我的理由是:返回一个 DependencyProperty.UnsetValue 而不是抛出一个 NotImplementedException 使得它在调用 ConvertBack 方法时不明显,而你真的不希望它这样做。也许它现在应该具有一些功能,因为它正在被调用并引发运行时异常。如果只是返回 DependencyProperty.UnsetValue,那么发现缺少的 ConvertBack 功能会困难得多。
【讨论】:
NotSupportedException,NotImplementedException 用于当前未实现但将要实现的功能。