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

时间:2015-07-23 07:13:03

标签: c# wpf scroll datagrid visibility

我有一个包含List的项目的Datagrid,此自定义列表中的一个属性是一个确定可见性的bool(可以通过复选框切换可见性)。

我的工作原理如下:

<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件物品。

有没有办法让滚动条通知可见性变化?或者我应该自己处理滚动事件并从数据网格中删除滚动条?

1 个答案:

答案 0 :(得分:1)

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

由于您的收藏集仍包含所有项目,因此滚动条尺寸不会更改。

解决方案:

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