Como: Bind to a Collection and Display Information Based on Selection

Em uma situação Mestre-Detalhes simples, você terá um ItemsControl com dados vinculados tal como um ListBox. Com base na seleção de usuário, você exibe mais informações sobre o item selecionado. Este exemplo mostra como implementar esse cenário.

Exemplo

Nesse exemplo, People é um ObservableCollection<T> das classes Person. Este Person classe contém três propriedades: FirstName, LastName, e HomeTown, todos do tipo string.

<Window x:Class="SDKSample.Window1"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

O ContentControl usa o seguinte DataTemplate que define como as informações de um Person são apresentadas:

<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 seguir é uma imagem da tela ilustrando o que o exemplo produz. O ContentControl mostra as outras propriedades da pessoa selecionada.

Associando a uma coleção

As duas coisas a observar no exemplo são:

  1. O ListBox e o ContentControl estão vinculados a mesma fonte. As propriedades do Path de ambas as ligações não são especificadas porque ambos os controles estão vinculando ao objeto da coleção inteira.

  2. Você deve definir a propriedade IsSynchronizedWithCurrentItem como true para que isso funciona. A definição dessa propriedade garante que o item selecionado é sempre definido como CurrentItem. Como alternativa, se o ListBox obtém seus dados de um CollectionViewSource, ele sincroniza automaticamente a seleção e moeda.

Observe que a classe Person substitui o método ToString da seguinte maneira. Por padrão, o ListBox chama ToString e exibe uma representação de sequência de caracteres de cada objeto na coleção acoplada. É o motivo pelo qual cada Person aparece como um primeiro nome na caixa ListBox.

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

For the complete sample, see VinculParar Para um exemplo de coleção.

Consulte também

Tarefas

Como: Use the Master-Detail Pattern with Hierarchical Data

Como: Use the Master-Detail Pattern with Hierarchical XML Data

Conceitos

Revisão de Associação de Dados

Visão geral sobre Templating de dados

Outros recursos

Exemplos de ligação de dados

Data Binding How-to Topics