5

根据这个答案,我正在实现一个 ListBox,其 ItemsPanel 是 WrapPanel ,但有一个转折:我的 ItemsSource 是一个分组的CollectionView。将 aGroupStyle应用于我的 ListBox 后,该问题中显示的换行不起作用:组始终垂直显示。

窥探我的应用程序,原因如下:

Snoop 在 GroupItem 中显示 WrapPanel

如您所见,WrapPanel,定义为我的ListBox 的ItemsPanelTemplate,出现在每个GroupItem的ItemsPresenter 中;创建一个隐式的、垂直方向的 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 不会被渲染,并且 WrapPanel(您可以在上面的屏幕截图中看到出现在 GroupItem 下方)代替屏幕截图中的 (StackPanel) 98 出现。

4

2 回答 2

11

仅当您在 GroupStyle 中定义了 HeaderTemplate 时,才会出现此行为。

可以通过将 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>

它看起来像这样:
在此处输入图像描述

于 2011-04-02T06:22:42.010 回答
0

您应该能够从项目控件 (ListBox) 中替换组样式:

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

或者,您还应该能够基于组项对象创建 DataTemplate:

<DataTemplate DataType="{x:Type GroupItem}">
    <Panel />
</DataTemplate>
于 2011-03-31T18:39:12.260 回答