WPF数据网格过滤项目,跳跃滚动条
本文关键字:跳跃 滚动条 项目 过滤 数据 数据网 网格 WPF | 更新日期: 2023-09-27 18:29:08
我有一个DataGrid
和一个填充控件的ItemSource
。我还使用了一个过滤/查询机制来过滤控件的内容。
当数据网格未被过滤时,滚动工作正常。但当我过滤(=将项目的可见性设置为false,这会将项目折叠在数据网格中)时,滚动变得非常"跳跃"。当我向下滚动时,滚动条会变得越来越大,滚动会成为一种烦人的体验。
我读过一些关于虚拟化和设置DataGrid.ScrollViewer的文章,但我在XAML中没有这两个属性。
为什么感觉琐碎的事情如此复杂。。。无论如何,我如何将我的数据网格配置为:
- 通过数据绑定显示项目列表
- 能够过滤列表(通过折叠项目)
- 很明显,它有一个滚动条,可以让用户滚动而不会感到沮丧:)
我的XAML:
<DataGrid Grid.Row="2"
ItemsSource="{Binding ErrorsThatStoppedMachine}"
AutoGenerateColumns="False"
SelectedItem="{Binding SelectedError}"
IsReadOnly="True"
SelectionMode="Single">
<DataGrid.Columns>
<DataGridTextColumn Header="Timestamp" Width="220" Binding="{Binding Path=Timestamp}" />
<DataGridTextColumn Header="ErrorCode" Width="90" Binding="{Binding Path=ErrorCode}" />
<DataGridTextColumn Header="Unit" Width="70" Binding="{Binding Path=Unit}" />
<DataGridTextColumn Header="State" Width="100" Binding="{Binding Path=MachineState}" />
<DataGridTextColumn Header="Message" Width="*" Binding="{Binding Path=Message}" />
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}"
d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=viewModels:ErrorViewModel}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsVisible}" Value="false">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
非常感谢。
附言:一些额外的解释将不胜感激,如果能从中真正学到一些东西,那将是一个很好的奖励。。。
DataGrid有一个ViewPort
,它只会渲染和计算实际显示的内容。这就是所谓的虚拟化。取决于行/单元格数据的视觉变化将不可避免地导致"跳跃",因为DataGrid将当场计算它们。
Scrollviewer
上的设置,以及将网格放入Scrollviewer
中,都将禁用虚拟化。这意味着整个网格将同时渲染:
- 网格可以平滑滚动
- 网格的初始加载时间会更长:在一定程度上,当太多数据附加到网格时,它将变得不可用
如果你的网格只包含有限数量的行,这可能没问题。
解决这个问题的更好方法是直接在ItemsSource
上进行过滤。使用ObservableCollection并在那里过滤您的数据。网格将根据ObservableCollection
显示行。
这就是您使用设置Visibility的RowStyle重新生成的行为。