Практическое руководство. Использование шаблона "основной-подчиненный" с иерархическими данными

В этом примере показано, как реализовать сценарий master-detail (сценарий основной информации и подробных сведений).

Пример

В этом примере LeagueList представляет собой коллекцию Leagues. Каждый League имеет Name и коллекцию Divisions, и каждый Division имеет имя и коллекцию Teams. У каждого Team есть имя команды.

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:src="clr-namespace:SDKSample"
  Width="400" Height="180"
  Title="Master-Detail Binding" 
  Background="Silver">
  <Window.Resources>
    <src:LeagueList x:Key="MyList"/>
  <DockPanel DataContext="{Binding Source={StaticResource MyList}}">
    <StackPanel>
      <Label>My Soccer Leagues</Label>
      <ListBox ItemsSource="{Binding}" DisplayMemberPath="Name"
               IsSynchronizedWithCurrentItem="true"/>
    </StackPanel>

    <StackPanel>
      <Label Content="{Binding Path=Name}"/>
      <ListBox ItemsSource="{Binding Path=Divisions}" DisplayMemberPath="Name"
               IsSynchronizedWithCurrentItem="true"/>
    </StackPanel>

    <StackPanel>
      <Label Content="{Binding Path=Divisions/Name}"/>
      <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Path=Divisions/Teams}"/>
    </StackPanel>
  </DockPanel>
</Window>

Ниже приведен снимок экрана примера. DivisionsListBox автоматически отслеживает выделенные фрагменты в LeaguesListBox и отображает соответствующие данные. TeamsListBox автоматически отслеживает выделенные фрагменты в двух других элементах управления ListBox.

Screenshot that shows a Master-detail scenario example.

Ниже указаны два аспекта, на которые следует обратить внимание в этом примере:

  1. Три элемента управления ListBox привязаны к одному и тому же источнику. Вы задаете свойство Path привязки, чтобы указать, какой уровень данных должен отобразить ListBox.

  2. Вы должны задать свойство IsSynchronizedWithCurrentItem для true в элементах управления ListBox, для которых выполняется отслеживание выделения. Задание значения этого свойства гарантирует, что выбранный элемент всегда задан как CurrentItem. Как вариант, если ListBox получает данные из CollectionViewSource, он автоматически синхронизирует выделение и валюту.

Этот метод немного отличается при использовании XML-данных. Пример см. в руководстве Использование шаблона Master-Detail с иерархическими данными XML.

См. также