IValueConverter una Interfaz muy util en el DataBinding de WPF

En los anteriores posts hemos visto como realizar el DataBinding en WPF, pero nos hemos centrado en los datos y algunas veces no nos valen el dato tal y como esta en la clase que enlazamos sino que requiere una transformación, con esta interfaz lo vamos a poder realizar.

La interfaz contiene dos métodos:

  • Convert: es llamada cuando se hace la conversión de datos desde la fuente hacia los componentes de UI (Int32 a Brush)
  • ConvertBack:ConvertBack es llamado cuando se convierte desde la UI a la fuente de datos

En cualquier caso, el valor actual y el tipo de datos son pasados a la función de conversión en el converter

Imaginemos que queremos que la propiedad ForeGroud de un TextBox se ponga de un color determinado en funcione de la edad, para ello utilizaremos un Converter

 

[ValueConversion(/*sourceType*/ typeof(int), 
                 /*targetType*/ typeof(Brush))]
public class AgeToForegroundConverter : IValueConverter {
   public object Convert(object value, Type targetType, ...) {
      if( targetType != typeof(Brush) ) { return null; }
         int age = int.Parse(value.ToString( ));
         return (age > 25 ? Brushes.Red : Brushes.Black);
      }
   }
   public object ConvertBack(object value, 
                             Type targetType, ...) {
         throw new NotImplementedException( );
   }
}

Si os fijáis la clase debe de tener el atributo ValueConversion donde se especifica el tipo del valor de entrada y el de salida en este caso int como entrda y brush como salida, es útil para documentar el tipo de conversión que estamos realizando, pero no es exigido por WPF

Después implementamos los métodos de Convert donde en este caso devolvemos una brocha roja o negra dependiendo si mayor o no de 25, en este caso no hace falta implementar el método ConverBack porque el Binding es OneWay.

El Binding en este caso seria

<!-- Window1.xaml -->
<Window ... xmlns:local="clr-namespace:WithBinding">
   <Window.Resources>
      <local:Person x:Key="Tom" ... />
      <local:AgeToForegroundConverter x:Key="ageConverter" />
   </Window.Resources>
   <Grid DataContext="{StaticResource Tom}">
      ...
      <TextBox
         Text="{Binding Path=Age}"
         Foreground="
            {Binding
               Path=Age,
               Converter={StaticResource ageConverter}}"
         ... />
      ...
      <Button ...
         Foreground="{Binding Path=Foreground, 
             ElementName=ageTextBox}">Birthday</Button>
   </Grid>
</Window>

Ponemos como recurso una referencia a la clase que implementa IValueConverter y en el Binding del ForeGround el Path esta enlazado a la propiedad Age pero tiene el parametro Converter relacionado con nuestro conversor.

 

De esta manera se implementa los converters, muy útiles en el DataBinding

 

 

5 comentarios sobre “IValueConverter una Interfaz muy util en el DataBinding de WPF”

  1. Ojo, que los converters son muy útiles, pero hay que ir con cuidado de no pasarnos y empezar a implementar converters a diestro y siniestro para cualquier cosa.

    Para disminuir el número de converters en Microsoft implementaron unos cuantos muy típicos (como el BoolToVisibilityConverter) para que no tengamos que hacerlos nosotros mismos. Además, para formateo simple de texto (como añadir una unidad de medida a una cifra) desde 3.5 SP1 y 3.0 SP2 añadieron la propiedad «StringFormat» a los Bindings.

    Otra utilidad de los converters es poder debugar un binding. En XAML no tienes breakpoints. Puedes hacer un converter que no haga nada (que devuelva el mismo valor de entrada) y ya puedes añadirle un breakpoint a los métodos del converter.

  2. Sobre el debug de binding viene en los siguientes posts y es cierto que no hay que pasarse pero como todo en la programación, cada cosa hay que utilizarlo para lo que se ha diseñado.

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *