MultiBinding en WPF

Vamos a fijarnos en  el post anterior sobre como enlazar enumeraciones a un ComboBox, si recordáis poníamos el Nombre, primer Apellido y Segundo Apellido en la lista de tres TextBox agrupados en un StackPanel

 

 

Esto no es lo mejor, lo bueno sería enlazar las tres propiedades a un solo TextBox, para ello utilizaremos el MultiBinding de WPF.

La clase MultiBinding describe una colección de objetos Binding asociados a una sola propiedad de destino de enlace.
MultiBinding permite enlazar una propiedad del destino de enlace a una lista de propiedades de origen y, a continuación, aplicar la lógica para generar un valor con las entradas indicadas. En su momento ya vimos el post de Converter de WPF, ahora necesitamos la interfaz IMultiValueConverter , que proporciona una forma de aplicar la lógica personalizada a una clase MultiBinding, esta interfaz tiene los mismos metodos que la interfaz IValueConverter: Convert y ConvertBack, solo que en este caso si nos fijamos en las firmas

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)

Podemos observar que la diferencia esta en el primer parametro que acepta en este caso un array de objects con los valores a enlazar

En este caso nos quedaria

public class NombreConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            //Convertimos a Nombre Apellido 1 Apellido2
            return values[0].ToString() + " " + values[1].ToString() + " " + values[2].ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }


    }

El Xaml en este caso seria

 

<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Grid.Column="0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,10">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock  Margin="0,0,5,0" >
                                <TextBlock.Text>
                                    <MultiBinding Converter="{StaticResource Convertidor}">
                                         <Binding Path="Nombre"/>
                                         <Binding Path="Apellido1"/>
                                         <Binding Path="Apellido2"/>
                                    </MultiBinding>
                                 </TextBlock.Text>
                            </TextBlock>
                        </StackPanel>
                        <TextBlock Text="{Binding Practico}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Es importante ver que el orden que pongamos en el Xaml será el orden que tenga en el array values de la función Convert.

 

La aplicación podéis ver que quedaría igual que el anterior

 

image

 

3 comentarios sobre “MultiBinding en WPF”

Deja un comentario

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