我有一个包含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件物品。
有没有办法让滚动条通知可见性变化?或者我应该自己处理滚动事件并从数据网格中删除滚动条?
答案 0 :(得分:1)
Datagrid默认使用称为行虚拟化的东西。启用行虚拟化时,滚动条使用逻辑scoll单位(项目)而不是实际大小。
由于您的收藏集仍包含所有项目,因此滚动条尺寸不会更改。
解决方案:
使用CollectionViewSource的Filter
事件,而不是绑定到Items视图模型。 MSDN