【问题标题】:Setting Visibility of Datagrid rows to Collapsed seems to break scrollbar?将 Datagrid 行的可见性设置为 Collapsed 似乎会破坏滚动条?
【发布时间】:2015-10-13 08:30:55
【问题描述】:

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

我有这样的工作:

<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 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物品什么的。

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

【问题讨论】:

    标签: c# wpf scroll datagrid visibility


    【解决方案1】:

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

    因为您的收藏仍然包含所有项目,所以滚动条大小不会改变。

    解决方案:

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

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2011-09-15
      • 2013-06-30
      • 2019-06-04
      • 2011-04-28
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2016-02-21
      相关资源
      最近更新 更多