只是想知道当实现一个没有有意义的ConvertBack实现(或一个只用作OneWay的)的IValueConverter时,人们认为什么是最佳实践?最佳实践时不执行IValueConvert.ConvertBack
它应该抛出(并在这种情况下是什么例外),返回null或返回一些默认值。
想法?
只是想知道当实现一个没有有意义的ConvertBack实现(或一个只用作OneWay的)的IValueConverter时,人们认为什么是最佳实践?最佳实践时不执行IValueConvert.ConvertBack
它应该抛出(并在这种情况下是什么例外),返回null或返回一些默认值。
想法?
IValueConverter.ConvertBack的MSDN文档建议返回DependencyProperty.UnsetValue。
数据绑定引擎不会捕获 异常,由一个 用户提供的转换器抛出。由ConvertBack 方法抛出的任何异常 或 ConvertBack方法调用的方法抛出的任何未捕获的异常 被视为运行时错误,将其视为 。通过返回 DependencyProperty.UnsetValue处理预期的 问题。
据微软,你应该返回DependencyProperty.UnsetValue
当ConvertBack不包含的功能,而你没想到它被调用,抛出一个NotImplementedException。它不应该被调用,因此你想要一个运行时异常。
如果ConvertBack是故意调用,那么您最好提供一个实现。一种选择是返回DependencyProperty.UnsetValue,或者通过返回DependencyProperty.UnsetValue来处理您的ConvertBack实现中的异常。
我给这理由是:返回DependencyProperty.UnsetValue而不是抛出一个NotImplementedException使得不明显时,当你真的从未想过这是一个ConvertBack方法被调用。也许它应该有一些功能,现在它被调用并抛出运行时异常。如果它只是返回DependencyProperty.UnsetValue,那么发现缺少的ConvertBack功能将会困难得多。
我同意@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();
}
}
如果你打算这样做,你应该使用`NotSupportedException`,`NotImplementedException`用于当前没有实现的功能,但将会是。 – Lukazoid 2012-07-20 10:50:40