将 Datagrid 行的可见性设置为折叠似乎会破坏滚动条?

Setting Visibility of Datagrid rows to Collapsed seems to break scrollbar?

我有一个包含项目的数据网格,此自定义列表中的一个 属性 是一个确定可见性的布尔值(可见性可以通过复选框切换)。

我有这样的工作方式:

<Style x:Key="RowStyle" TargetType="DataGridRow">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsVisible}" Value="False">
            <Setter Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsVisible}" Value="True">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

我的 Datagrid 是这样的:

<DataGrid Name="dataList" DataContext="{StaticResource DataViewSource}" ItemsSource="{Binding}" 
          ItemContainerStyle="{StaticResource RowStyle}"
          ScrollViewer.VerticalScrollBarVisibility="Auto"
          ScrollViewer.HorizontalScrollBarVisibility="Auto"
          AutoGenerateColumns="False" 
          CanUserAddRows="False" 
          CanUserDeleteRows="False" 
          IsReadOnly="True"
          CanUserReorderColumns="True" CanUserSortColumns="True"> ..etc

假设我有 100 行,当切换可见性时,其中 80 行被折叠。

问题是:当项目的可见性改变时,滚动条似乎没有更新。从外观上看,这 80 行似乎仍然可见(小拖动条),但是当尝试滚动可见的 20 行时,它需要更多的滚动,因为滚动条假设它仍然必须滚动 100项目或其他东西。

有什么方法可以通知滚动条可见性发生变化?或者我应该自己处理滚动事件并从数据网格中删除滚动条?

Datagrid 默认使用行虚拟化。当启用行虚拟化时,滚动条使用逻辑 scoll 单位(项目)而不是实际大小。

因为您的 collection 仍然包含所有项目,所以滚动条大小没有改变。

解决方案:

使用 CollectionViewSource 的 Filter 事件而不是绑定到 Items 视图模型。 MSDN