2008-11-05 10 views

Respuesta

40

La documentación de MSDN para IValueConverter.ConvertBack recomienda devolver DependencyProperty.UnsetValue.

Los datos de motor de enlace no coge excepciones lanzadas por un convertidor suministrado por el usuario . Cualquier excepción lanzada por el método ConvertBack , o cualquier excepción no detectada que se generen por los métodos que llama el método ConvertBack, se tratan como errores de tiempo de ejecución. Manejar problemas anticipados al devolver DependencyProperty.UnsetValue.

4

Según Microsoft, debe devolver DependencyProperty.UnsetValue

3

Cuando ConvertBack contiene ninguna funcionalidad, y que son sin esperar que sea llamado, lanzar una NotImplementedException. No debería haber sido llamado y, por lo tanto, desea una excepción de tiempo de ejecución.

Si ConvertBack es intencionalmente llamado, entonces es mejor que proporcione una implementación para él. Una opción es simplemente devolver DependencyProperty.UnsetValue, o manejar excepciones dentro de su implementación de ConvertBack devolviendo DependencyProperty.UnsetValue.

Mi justificación para esto sería: devolver un DependencyProperty.UnsetValue en vez de lanzar una NotImplementedException hace que sea no evidente cuando se invoca un método ConvertBack cuando realmente nunca se pretendió que fuera. Tal vez debería tener alguna funcionalidad ahora que se está invocando y arrojando una excepción de tiempo de ejecución. Sería mucho más difícil descubrir la funcionalidad ConvertBack que falta si solo está devolviendo DependencyProperty.UnsetValue.

+4

Si va a hacer esto, debe utilizar 'NotSupportedException',' NotImplementedException' es para la funcionalidad que no está actualmente implementada, pero lo será. – Lukazoid

2

Acepto la respuesta de @Todd White.

Además, para ahorrar tiempo, puede implementar una clase de convertidor base que implemente ConvertBack para que no tenga que implementarlo cada vez que guarde el código duplicado.

Técnicamente, usted no tiene que anular Convert tampoco; Pero tiene que implementarse en ConverterBase ya que implementa todos los métodos de la interfaz IValueConverter. En la práctica, va a anular Convert cada vez y ConvertBack se puede ignorar la mayor parte del tiempo.

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