c# - WPF ValueConverter-Retorno estándar por valor no convertible
converters wpf (6)
A lo largo del último año, más o menos, he visto muchos convertidores de valor diferentes para muchos propósitos diferentes, de muchos autores diferentes. Una cosa que sobresale en mi mente es la gran variación de los valores "predeterminados" que devuelven. Por ejemplo;
public class MyConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// OK, we test for some undesirable, unconvertable situation, typically null...
if (value == null)
{
// And here are a variety of ''defaults'' that I have seen, these begin the most typical.
return null;
return DependencyProperty.UnsetValue;
return Binding.DoNothing;
}
//...... other code.. whatever...
}}
Entonces, mi pregunta es, ¿existe una forma "estándar" para indicar que un valor de entrada no se puede convertir?
Cuando mire estos valores, descubrirá lo que significan. A continuación, elija el derecho para volver en su convertidor.
El problema principal es que el valor nulo puede ser un valor válido para la propiedad.
DependencyProperty.UnsetValue para indicar que la propiedad existe, pero no tiene su valor establecido por el sistema de propiedades
Binding.DoNothing que Binding.DoNothing al motor de encuadernación que no transfiera un valor al objetivo de encuadernación, que no se mueva al siguiente Encuadernación en una encuadernación prioritaria o que no utilice el valor predeterminado de FallBackValue
EDITAR
Para indicar que no puede convertir el valor, simplemente debe devolver el valor dado. Es lo mejor que puede hacer porque devuelve el problema al autor del enlace. Si se entromete con el valor, se vuelve muy difícil descubrir lo que está sucediendo.
Después de mucho pensar y cavar alrededor, parece que DependencyProperty.UnsetValue es la opción adecuada. He trasladado todo en casa a este patrón con mucho éxito. Además, el texto en la sección ''Comentarios'' de DependencyProperty.UnsetValue indica que esta es probablemente la mejor opción.
También hay cierta discusión sobre la devolución del valor de entrada si no se puede convertir un enlace, pero esto puede "romper" fácilmente el sistema de enlace. Piense en un caso donde la entrada de enlace es una "cadena" y la salida es un "pincel". ¡Devolver una cadena no va a funcionar!
Generalmente si un valor no se puede convertir, lanzo una Exception
Esto se debe a que si estoy tratando de convertir un valor utilizando un convertidor no válido, me gustaría que me avisen para poder modificar mi código.
En algunos casos raros, un valor puede ser válido aunque no se pueda convertir y, en ese caso, generalmente devuelvo el mismo valor que se pasó al convertidor. Esto solo se usa si quiero que el valor se convierta si es posible, o para que permanezca igual si no es así.
Otro caso raro que he hecho en ocasiones es la codificación de un valor predeterminado. Esto generalmente se hace cuando sé que el Convertidor se puede usar con un parámetro no válido, y quiero devolver un valor válido sin importar cuál sea el resultado. Mis convertidores predeterminados codificados por hardware casi siempre devuelven valores booleanos.
No creo que haya devuelto ninguno de los 3 que especificó ( null
, DependencyProperty.UnsetValue
o Binding.DoNothing
) porque esos valores son a menudo inesperados y no son fáciles de notar a menos que los busque específicamente.
Lo que devuelves por defecto depende de la situación. No desea devolver un int como valor predeterminado para un convertidor a un bool, o devolver un bool para un convertidor para la enumeración de visibilidad.
Según MSDN - IValueConverter :
El motor de enlace de datos no detecta las excepciones generadas por un convertidor proporcionado por el usuario. Cualquier excepción lanzada por el método Convert o cualquier excepción no detectada lanzada por los métodos que llama el método Convert, se tratan como errores en tiempo de ejecución. Maneje los problemas anticipados devolviendo DependencyProperty.UnsetValue .
La línea clave es Manejar los problemas anticipados al devolver DependencyProperty.UnsetValue.
También puede devolver un objeto predeterminado de targetType
real utilizando esta función:
public static object GetDefault(Type type)
{
if(type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
Fuente: C # - Equivalente programático de predeterminado (Tipo)