В WPF Listbox
меня смущают эти два понятия: ItemTemplate
и ItemsPanelTemplate
Может ли кто-нибудь объяснить мне больше?
Спасибо Джон
В WPF Listbox
меня смущают эти два понятия: ItemTemplate
и ItemsPanelTemplate
Может ли кто-нибудь объяснить мне больше?
Спасибо Джон
Попробую объяснить это на примере:
<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>
И результат:
ItemTemplate
определяет расположение каждого элемента в списке. С другой стороны, ItemsPanel
— это панель, которая будет содержать отдельные элементы. Учитывая приведенное выше определение, визуальное дерево будет примерно таким:
<StackPanel>
<Border>
<TextBlock Text="Alpha"/>
</Border>
<Border>
<TextBlock Text="Beta"/>
</Border>
....
</StackPanel>
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).