具有 GroupStyle 的列表框按组滚动,而不是按项目滚动

ListBox with GroupStyle scrolls by group, not by item

我有一个 ListBox 和一个 GroupStyle。如果我使用 GroupStyle ListBoxScrollViewer 按组而不是那个项目滚动。因此,如果该组的项目多于屏幕上显示的项目,则用户永远不会看到屏幕外的项目。如果我注释掉 GroupStyle,那么 ScrollViewer 就像一个项目一个项目地滚动一样。 (我添加了 ControlTemplate 来尝试不同的东西)。

<UserControl.Resources>
    <CollectionViewSource x:Key="BusStopsFlattend" Source="{Binding BusStopsFlat}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="CountryCode" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</UserControl.Resources>

<ListBox Grid.Row="1" ItemsSource="{Binding Source={StaticResource BusStopsFlattend}}" Margin="48,0,48,60">
<ListBox.Template>
    <ControlTemplate TargetType="{x:Type ListBox}">
        <ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Disabled">
            <ItemsPresenter />
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid Margin="0,24,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <controls:IconViewbox Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" IconData="{StaticResource IconPathPencilOutline}" IconSize="72" Margin="0,0,24,0" />

            <TextBlock Grid.Column="1" Grid.Row="0" FontSize="32" TextWrapping="Wrap" Text="Name" /> 
            <TextBlock Grid.Column="1" Grid.Row="1" FontSize="22" TextWrapping="Wrap" Text="Address" />
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

<ListBox.GroupStyle>
    <GroupStyle>
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <StackPanel />
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <TextBlock Grid.Row="0" FontSize="36" FontWeight="Bold" Margin="0,48,0,24" Text="{Binding Name}" />
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ListBox.GroupStyle>
</ListBox>

只需将 ScrollViewer.CanContentScroll 属性 设置为 False 即可使用物理滚动而不是逻辑滚动。请记住,如果您决定使用它,这将禁用虚拟化。