Могут ли группы сгруппированного CollectionView быть представлены горизонтально? - PullRequest
3 голосов
/ 31 марта 2011

Я реализую ListBox, у которого ItemsPanel является WrapPanel согласно этому ответу , но есть поворот: мой ItemsSource является сгруппированным CollectionView. С GroupStyle, примененным к моему ListBox, перенос, показанный в этом вопросе, не работает: группы всегда отображаются вертикально.

Snoop в моем приложении, вот почему:

Snoop displaying WrapPanel in GroupItem

Как вы можете видеть, 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 на скриншоте.

Ответы [ 2 ]

9 голосов
/ 02 апреля 2011

Такое поведение возникает, только если вы определили шаблон HeaderTemplate в GroupStyle.

Это можно исправить, установив для свойства GroupStyle.Panel значение WrapPanel:

<ListBox.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <WrapPanel></WrapPanel>
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
    </GroupStyle>
</ListBox.GroupStyle>

Это будет выглядеть примерно так:
enter image description here

0 голосов
/ 31 марта 2011

Вы должны иметь возможность заменить стиль группы из элемента управления элементами (ListBox):

<ListBox.GroupStyle>
    <Style />
<ListBox.GroupStyle/>

Или вы также можете создать шаблон данных на основе объекта элемента группы:

<DataTemplate DataType="{x:Type GroupItem}">
    <Panel />
</DataTemplate>
...