Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Procedura: eseguire l'associazione di una raccolta e visualizzare informazioni in base alla selezione effettuata

 

Data di pubblicazione: giugno 2016

In un semplice scenario Master-Details si dispone di un elemento ItemsControl associato ai dati come ListBox. In base alla selezione dell'utente vengono visualizzate più informazioni relative all'elemento selezionato. In questo esempio viene illustrato come implementare tale scenario.

Esempio

In questo esempio People è un oggetto ObservableCollection<T> delle classi Person. Questa classe Person contiene tre proprietà, FirstName, LastName e HomeTown, tutte di 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>

ContentControl utilizza l'oggetto DataTemplate riportato di seguito che definisce il modo in cui vengono presentate le informazioni di 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>

Di seguito è disponibile una schermata del risultato dell'esempio. ContentControl mostra le altre proprietà della persona selezionata.

Binding to a Collection

Si notino i due aspetti dell'esempio riportati di seguito:

  1. ListBox e ContentControl sono associati alla stessa origine. Le proprietà Path di entrambe le associazioni non sono specificate perché entrambi i controlli vengono associati all'intero oggetto Collection.

  2. È necessario impostare la proprietà IsSynchronizedWithCurrentItem su true perché funzioni. L'impostazione di questa proprietà assicura che l'elemento selezionato sia sempre impostato come CurrentItem. In alternativa, se ListBox ottiene i dati da un oggetto CollectionViewSource, la selezione e la valuta vengono sincronizzate automaticamente.

L'override del metodo ToString viene eseguito dalla classe Person nel modo seguente. Per impostazione predefinita, ListBox chiama ToString e visualizza una rappresentazione di stringa di ogni oggetto nella raccolta associata. Questo è il motivo per cui ogni oggetto Person viene visualizzato come nome nel controllo ListBox.

public override string ToString()
{
    return firstname.ToString();
}
Mostra: