В чем разница между ItemTemplate и ItemPanelTemplate? - PullRequest
13 голосов
/ 11 сентября 2009

В WPF Listbox я путаюсь с этими двумя понятиями: ItemTemplate и ItemsPanelTemplate Может кто-нибудь объяснить мне больше?

Спасибо John

Ответы [ 2 ]

20 голосов
/ 11 сентября 2009

Позвольте мне попытаться объяснить это на примере:

<ListBox ItemsSource="{Binding}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Border Background="SteelBlue" Padding="5" BorderBrush="Black"
        BorderThickness="1" Margin="0,2">
        <TextBlock Text="{Binding}"/>
      </Border>
    </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Background="DarkKhaki"/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

И результат:

WPF ListBox templates example

ItemTemplate определяет расположение каждого элемента в списке. С другой стороны, ItemsPanel - это панель, которая будет содержать отдельные элементы. Учитывая приведенное выше определение, визуальное дерево будет примерно таким:

<StackPanel>
  <Border>
    <TextBlock Text="Alpha"/>
  </Border>
  <Border>
    <TextBlock Text="Beta"/>
  </Border>
  ....
</StackPanel>
10 голосов
/ 11 сентября 2009

ItemTemplate используется для указания DataTemplate, используемого для визуализации элемента в вашем ListBox. ItemPanelTemplate используется для указания панели, используемой для упорядочения дочерних элементов вашего ListBox.

Например, если ваш ListBox связан с ObservableCollection, вы должны указать DataTemplate, чтобы сообщить ему, как визуализировать каждый объект Person.

<ListBox ItemsSource={Binding Persons}>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text={Binding FirstName}/>
        <TextBlock Text={Binding LastName}/>
        <TextBlock Text={Binding Age}/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Это расположит каждый элемент по вертикали, поскольку ListBox по умолчанию использует StackPanel. Если вы хотите изменить это поведение, используйте свойство ItemPanelTemplate:

<ListBox>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>            
  </ListBox.ItemsPanel>
</ListBox>

Вы даже можете изменить StackPanel на любую другую панель (например, WrapPanel).

...