Каково различие между ItemTemplate и ItemPanelTemplate?

import module
help(module)
14
задан Dave Clemmer 11 August 2011 в 19:38
поделиться

2 ответа

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

<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>
21
ответ дан 1 December 2019 в 08:42
поделиться

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).

11
ответ дан 1 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: