Вы можете сделать это, используя вложенную ItemsControls
привязанную к PagedCollectionView .
Скажем, у меня есть источник данных - MyItems
- с полями: Category
, Section
и Option
. Я могу создать PagedCollectionView
из IEnumerable(of MyItems)
и сказать ему, по каким полям группировать.
Dim original As IEnumerable(Of MyItems) = GetMyItems()
Dim pcv = New PagedCollectionView(original)
pcv.GroupDescriptions.Add(New PropertyGroupDescription("Category"))
pcv.GroupDescriptions.Add(New PropertyGroupDescription("Section"))
Затем я связываю свой первый ItemsControl
с PagedCollectionView
hisMyItems.ItemsSource = pcv.Groups
PCV
создает вложенную иерархию, такую как:
-Name
-Items
где Name
- это значение в сгруппированном поле, а Items
содержит строки / объекты в этой группировке. Я думаю, вы также можете создать PCV в xaml, если хотите.
xaml будет выглядеть примерно так:
<controls:HeaderedItemsControl x:Name="hisMyItems" Header="{Binding Name}" ItemsSource="{Binding Items}" >
<controls:HeaderedItemsControl.ItemTemplate>
<DataTemplate>
<controls:HeaderedItemsControl Header="{Binding Name}" ItemsSource="{Binding Items}" ItemsPanel="{StaticResource ItemsPanelTemplate1}" >
<controls:HeaderedItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Option}" />
</DataTemplate>
</controls:HeaderedItemsControl.ItemTemplate>
</controls:HeaderedItemsControl>
</DataTemplate>
</controls:HeaderedItemsControl.ItemTemplate>
</controls:HeaderedItemsControl>
Надеюсь, это имеет смысл. Я пытался упростить вещи из своего реального приложения, но я мог допустить некоторые ошибки при копировании. Очевидно, что вы можете использовать обычные ItemsControls или другие элементы управления и настраивать их с помощью шаблонов и т. Д.