Поделиться через


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

В этом примере показано, как реализовать сценарий 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 элемента управления.

Снимок экрана: пример сценария master-detail.

Две вещи, на которые стоит обратить внимание в этом примере, это:

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

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

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

См. также