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
Vamos a fijarnos en el post anterior sobre como enlazar enumeraciones a un ComboBox, si recordáis
Oye… al post le falta informacion. Por ejemplo: En donde instancias la clase NombreConverter?
NombreConverter se instancia en los recursos de la ventana en XAML