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

标签 c# wpf scroll datagrid visibility

我有一个包含列表项的数据网格,此自定义列表中的一个属性是一个 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元素或其他东西。

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

最佳答案

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

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

解决方法:

使用 CollectionViewSource 的 Filter 事件而不是绑定(bind)到 Items View 模型。 MSDN

关于c# - 将 Datagrid 行的可见性设置为折叠似乎会破坏滚动条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31580519/

相关文章:

c# - WPF:如何绑定(bind)到另一个控件绑定(bind)的属性?

c# - 基本 WPF LiveCharts DateTime 示例不起作用

user-interface - 黑莓-自动滚动垂直字段管理器

javascript - 在 Chrome 扩展程序弹出窗口中保存滚动位置时遇到问题

c# - MVVM 中具有动态内容的 WPF 状态栏

c# - 在 Powershell Cmdlet 中处理同步的最佳方式

c# - 如何读取主题的保留消息

c# - WPF 在菜单显示之前更新上下文菜单项

android - 如何在 Android 中水平/垂直滚动全景图像?

c# - 如何获取带有完整月份名称的完整日期,例如 2015 年 11 月 2 日