只是想知道當實現一個沒有有意義的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