2008-11-05 51 views
28

只是想知道當實現一個沒有有意義的ConvertBack實現(或一個只用作OneWay的)的IValueConverter時,人們認爲什麼是最佳實踐?最佳實踐時不執行IValueConvert.ConvertBack

它應該拋出(並在這種情況下是什麼例外),返回null或返回一些默認值。

想法?

回答

40

IValueConverter.ConvertBack的MSDN文檔建議返回DependencyProperty.UnsetValue

數據綁定引擎不會捕獲 異常,由一個 用戶提供的轉換器拋出。由ConvertBack 方法拋出的任何異常 或 ConvertBack方法調用的方法拋出的任何未捕獲的異常 被視爲運行時錯誤,將其視爲 。通過返回 DependencyProperty.UnsetValue處理預期的 問題。

4

據微軟,你應該返回DependencyProperty.UnsetValue

3

當ConvertBack不包含的功能,而你沒想到它被調用,拋出一個NotImplementedException。它不應該被調用,因此你想要一個運行時異常。

如果ConvertBack是故意調用,那麼您最好提供一個實現。一種選擇是返回DependencyProperty.UnsetValue,或者通過返回DependencyProperty.UnsetValue來處理您的ConvertBack實現中的異常。

我給這理由是:返回DependencyProperty.UnsetValue而不是拋出一個NotImplementedException使得不明顯時,當你真的從未想過這是一個ConvertBack方法被調用。也許它應該有一些功能,現在它被調用並拋出運行時異常。如果它只是返回DependencyProperty.UnsetValue,那麼發現缺少的ConvertBack功能將會困難得多。

+4

如果你打算這樣做,你應該使用`NotSupportedException`,`NotImplementedException`用於當前沒有實現的功能,但將會是。 – Lukazoid 2012-07-20 10:50:40

2

我同意@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(); 
    } 
}