Compartir a través de


Cómo: Enlazar a una colección y mostrar información basada en la selección

En un escenario sencillo de maestro y detalle, tiene un enlazador de datos como ItemsControl, como ListBox. En función de la selección de usuario, se muestra más información sobre el elemento seleccionado. En este ejemplo se muestra cómo implementar este escenario.

Ejemplo

En este ejemplo, People es ObservableCollection<T> de la clase Person. Esta Person clase contiene tres propiedades: FirstName, LastNamey HomeTown, todo de tipo string.

<Window x:Class="SDKSample.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:SDKSample"
  Title="Binding to a Collection"
  SizeToContent="WidthAndHeight">
  <Window.Resources>
    <local:People x:Key="MyFriends"/>
  </Window.Resources>

  <StackPanel>
    <TextBlock FontFamily="Verdana" FontSize="11"
               Margin="5,15,0,10" FontWeight="Bold">My Friends:</TextBlock>
    <ListBox Width="200" IsSynchronizedWithCurrentItem="True"
             ItemsSource="{Binding Source={StaticResource MyFriends}}"/>
    <TextBlock FontFamily="Verdana" FontSize="11"
               Margin="5,15,0,5" FontWeight="Bold">Information:</TextBlock>
    <ContentControl Content="{Binding Source={StaticResource MyFriends}}"
                    ContentTemplate="{StaticResource DetailTemplate}"/>
  </StackPanel>
</Window>

El ContentControl usa el siguiente DataTemplate que define cómo se presenta la información de un Person:

<DataTemplate x:Key="DetailTemplate">
  <Border Width="300" Height="100" Margin="20"
          BorderBrush="Aqua" BorderThickness="1" Padding="8">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Row="0" Grid.Column="0" Text="First Name:"/>
      <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName}"/>
      <TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name:"/>
      <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=LastName}"/>
      <TextBlock Grid.Row="2" Grid.Column="0" Text="Home Town:"/>
      <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=HomeTown}"/>
    </Grid>
  </Border>
</DataTemplate>

A continuación se muestra una captura de pantalla de lo que genera el ejemplo. El ContentControl muestra las demás propiedades de la persona seleccionada.

Vinculación a una colección

Las dos cosas que se deben observar en este ejemplo son:

  1. ListBox y ContentControl enlazan al mismo origen. No se especifican las Path propiedades de ambos enlaces porque ambos controles están enlazando a todo el objeto de colección.

  2. Debe establecer la propiedad IsSynchronizedWithCurrentItem en true para que funcione. Establecer esta propiedad garantiza que el elemento seleccionado siempre se establezca como CurrentItem. Como alternativa, si ListBox obtiene sus datos de un CollectionViewSource, sincroniza automáticamente la selección y el curso.

Tenga en cuenta que la Person clase invalida el ToString método de la siguiente manera. De forma predeterminada, ListBox llama a ToString y muestra una representación en forma de cadena de cada objeto en la colección enlazada. Por eso cada Person aparece como nombre de pila en el ListBox.

public override string ToString()
{
    return firstname.ToString();
}
Public Overrides Function ToString() As String
    Return Me._firstname.ToString
End Function

Consulte también