2008-11-05 3 views
28

Fragen Sie sich einfach, was Leute denken, ist die beste Vorgehensweise bei der Implementierung eines IValueConverter, die keine sinnvolle ConvertBack-Implementierung (oder eine, die nur als OneWay verwendet wird)?Best Practice bei der Implementierung von IValueConvert.ConvertBack

Sollte es (und in diesem Fall, was Ausnahme) werfen, geben Sie null zurück oder geben Sie einen Standardwert zurück.

Gedanken?

Antwort

40

Die MSDN-Dokumentation für IValueConverter.ConvertBack empfiehlt, DependencyProperty.UnsetValue zurückzugeben.

Die Datenbindung Motor nicht Ausnahmen verfängt, die von einem Benutzer gelieferten Konverter geworfen werden. Jede Ausnahme , die von der ConvertBack -Methode ausgelöst wird, oder alle nicht abgefangenen Ausnahmen , die von Methoden ausgelöst werden, die von der ConvertBack-Methode aufgerufen werden, werden als Laufzeitfehler behandelt . Behandeln Sie die erwarteten Probleme, indem Sie DependencyProperty.UnsetValue zurückgeben.

4

Microsoft Laut, sollten Sie zurückkommen DependencyProperty.UnsetValue

3

Wenn ConvertBack keine Funktionalität enthält, und Sie sind nicht erwartet, dass es aufgerufen werden, eine NotImplementedException werfen. Es sollte nicht aufgerufen worden sein und Sie möchten daher eine Laufzeitausnahme.

Wenn ConvertBack absichtlich aufgerufen wird, dann sollten Sie eine Implementierung dafür bereitstellen. Eine Option besteht darin, DependencyProperty.UnsetValue zurückzugeben oder Ausnahmen in Ihrer ConvertBack-Implementierung zu behandeln, indem DependencyProperty.UnsetValue zurückgegeben wird.

Meine Begründung dafür wäre: ein DependencyProperty.UnsetValue Rückkehr stattdessen eine NotImplementedException werfen macht es unobvious wenn eine ConvertBack Methode aufgerufen wird, wenn Sie wirklich nie beabsichtigt zu sein. Vielleicht sollte es jetzt Funktionalität haben, da es aufgerufen wird und eine Laufzeitausnahme auslöst. Es wäre viel schwieriger, die fehlende ConvertBack-Funktionalität zu finden, wenn DependencyProperty.UnsetValue zurückgegeben wird.

+4

Wenn Sie dies tun, sollten Sie 'NotSupportedException' verwenden,' NotImplementedException' steht für Funktionalität, die derzeit nicht implementiert ist, aber sein wird. – Lukazoid

2

Ich stimme @ Todd White's Antwort.

Um Zeit zu sparen, können Sie außerdem eine Basiskonverterklasse implementieren, die ConvertBack für Sie implementiert, sodass Sie sie nicht jedes Mal implementieren müssen, wenn Sie doppelten Code speichern.

Technisch müssen Sie Convert entweder nicht überschreiben; Aber es muss in ConverterBase implementiert werden, da es alle Methoden der IValueConverter Schnittstelle implementiert. In der Praxis überschreiben Sie jedes Mal Convert und ConvertBack kann die meiste Zeit ignoriert werden.

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(); 
    } 
}