只是想知道在实现没有有意义的ConvertBack实现的IValueConverter时(或者只是用作OneWay的实现),人们认为最佳做法是什么?
它应该抛出(在这种情况下是什么异常),返回null或返回一些默认值。
思想?
答案 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();
}
}