Cómo: Generar un valor basado en una lista de elementos enlazados

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 este ejemplo de complemento se muestra cómo utilizar MultiBinding.

Ejemplo

En el ejemplo siguiente, NameListData hace referencia a una colección de objetos PersonName, que son objetos que contienen dos propiedades, firstName y lastName. En el ejemplo siguiente se genera un objeto TextBlock que muestra el nombre y el apellido de una persona, con el apellido en primer lugar.

<Window
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:SDKSample"
  x:Class="SDKSample.Window1"
  Width="400"
  Height="280"
  Title="MultiBinding Sample">
    
  <Window.Resources>
    <c:NameList x:Key="NameListData"/>
    <c:NameConverter x:Key="myNameConverter"/>


...


</Window.Resources>


...


<TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
  <TextBlock.Text>
    <MultiBinding Converter="{StaticResource myNameConverter}"
                  ConverterParameter="FormatLastFirst">
      <Binding Path="FirstName"/>
      <Binding Path="LastName"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>


...


</Window>

Para entender cómo se genera el formato que muestra primero el apellido, estudiaremos la implementación de NameConverter:

Public Class NameConverter
    Implements IMultiValueConverter

Public Function Convert1(ByVal values() As Object, _
                         ByVal targetType As System.Type, _
                         ByVal parameter As Object, _
                         ByVal culture As System.Globalization.CultureInfo) As Object _
                         Implements System.Windows.Data.IMultiValueConverter.Convert
    Select Case CStr(parameter)
        Case "FormatLastFirst"
            Return (values(1) & ", " & values(0))
    End Select
    Return (values(0) & " " & values(1))
End Function

Public Function ConvertBack1(ByVal value As Object, _
                             ByVal targetTypes() As System.Type, _
                             ByVal parameter As Object, _
                             ByVal culture As System.Globalization.CultureInfo) As Object() _
                             Implements System.Windows.Data.IMultiValueConverter.ConvertBack
    Return CStr(value).Split(New Char() {" "c})
End Function
End Class
public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string name;

        switch ((string)parameter)
        {
            case "FormatLastFirst":
                name = values[1] + ", " + values[0];
                break;
            case "FormatNormal":
            default:
                name = values[0] + " " + values[1];
                break;
        }

        return name;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        string[] splitValues = ((string)value).Split(' ');
        return splitValues;
    }
}

NameConverter implementa la interfaz IMultiValueConverter. NameConverter toma los valores de los enlaces individuales y los almacena en la matriz de objetos de valores. El orden en el que los elementos Binding aparecen bajo el elemento MultiBinding es el orden en el que esos valores están almacenados en la matriz. El argumento de parámetro del método de Converter, que aplica una modificación al parámetro para determinar cómo dar formato al nombre, hace referencia al valor del atributo ConverterParameter.

Vea también

Tareas

Cómo: Convertir datos enlazados

Conceptos

Información general sobre el enlace de datos

Otros recursos

Temas "Cómo..." sobre enlace de datos