Multi-Conversor en WPF con IMultiValueConverter

A raíz de un post del blog de Javier Torrecilla y una posterior conversación en Twitter, he decidido escribir mi primera entrada.

Hablaré un poco sobre cómo implementar la interfaz  System.Windows.Data.IMultiValueConverter y propondré un ejemplo, a mi parecer, divertido.

La interfaz IMultiValueConverter contiene dos métodos, Convert y ConvertBack, al igual que en IValueConverter. A diferencia de como ocurre en ésta, Convert recibe en su primer parámetro un array de object. Es por ello que ya no estamos ante un Converter normal y corriente que transforma un objeto en otro, sino que tenemos la posibilidad de pasarle a dicha función tantos objetos como queramos, los cuales serán posteriormente utilizados para crear el valor resultado.

Veamos el ejemplo:

Código del multi-conversor:

 1: using System.Windows.Data;
 2: using System;
 3: using System.Globalization;
 4: namespace IMultiValueConverterExample
 5: {
 6:    public class ChromosomeToBabyConverter : IMultiValueConverter
 7:    {
 8:       public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
 9:       {
 10:          string first = (string)values[0];
 11:          string second = (string)values[1];
 12:          if (first == second && first == "X")
 13:          {
 14:             return "Girl";
 15:          }
 16:          else if (first == "X" && second == "Y" || first == "Y" && second == "X")
 17:          {
 18:             return "Boy";
 19:          }
 20:          else
 21:          {
 22:             return "Angel";
 23:          }
 24:       }
 25:  
 26:       public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
 27:       {
 28:          if ((string)value == “Boy”)
 29:          {
 30:             return new string[] { “X”, “Y” };
 31:          }
 32:          else if ((string)value == “Girl”)
 33:          {
 34:             return new string[] { “X”, “X” };
 35:          }
 36:          else
 37:          {
 38:             return new string[] { “Y”, “Y” };
 39:          }
 40:       }
 41:    }
 42: }

 
Y ahora el marcado XAML con una sencillísima interfaz que contiene tres TextBox. (Los dos primeros permiten escribir el tipo de cromosoma y el tercero muestra el sexo del bebé)

 1: <Window x:Class="IMultiValueConverterExample.MainWindow"
 2:    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3:    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4:    Title="IMultiValueConverterExample"
 5:    xmlns:local="clr-namespace:IMultiValueConverterExample">
 6:    <StackPanel>
 7:       <StackPanel.Resources>
 8:          <local:ChromosomeToBabyConverter x:Key="converter"/>
 9:       </StackPanel.Resources>
 10:       <TextBox x:Name="first"/>
 11:       <TextBox x:Name="second"/>
 12:       <TextBox>
 13:          <TextBox.Text>
 14:             <MultiBinding Converter="{StaticResource converter}">
 15:                <Binding ElementName="first" Path="Text"/>
 16:                <Binding ElementName="second" Path="Text"/>
 17:             </MultiBinding>
 18:          </TextBox.Text>
 19:       </TextBox>
 20:    </StackPanel>
 21: </Window>

 
Espero que en éste, mi primer post, me haya explicado correctamente y con ello la gente se anime al uso de esta técnica.
¡Saludos!

Anuncios

2 comentarios en “Multi-Conversor en WPF con IMultiValueConverter

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s