Я реализую ListBox, у которого ItemsPanel является WrapPanel согласно этому ответу , но есть поворот: мой ItemsSource является сгруппированным CollectionView. С GroupStyle
, примененным к моему ListBox, перенос, показанный в этом вопросе, не работает: группы всегда отображаются вертикально.
Snoop в моем приложении, вот почему:
![Snoop displaying WrapPanel in GroupItem](https://i.stack.imgur.com/ij1Nb.png)
Как вы можете видеть, WrapPanel, определенная как ItemsPanelTemplate моего ListBox, появляется в ItemsPresenter в каждого GroupItem; создается неявная вертикально ориентированная StackPanel (верхний элемент в розовом поле), которая содержит сами элементы GroupItems.
Есть ли способ переопределить это поведение, чтобы GroupItems помещались в WrapPanel? Должен ли я повторно шаблонировать весь ListBox?
Обновление: Чтобы проиллюстрировать, что я на самом деле делаю с моим ListBox и группировкой CollectionView, позвольте мне опубликовать небольшой XAML:
<Grid>
<ListBox ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
SelectionMode="Multiple"
ItemContainerStyle="{StaticResource itemStyle}">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontWeight="Bold"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type WpfApplication1:Item}">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}" FontSize="10"/>
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" FontSize="10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
В основе этого лежит GroupStyle
: если вы удалите его, элементы GroupItems не будут визуализированы, и вместо (StackPanel появится WrapPanel (который можно увидеть под GroupItem на снимке экрана выше). ) 98 на скриншоте.