bas*_*bas 6 c# wpf xaml datagrid
我有一个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>
Run Code Online (Sandbox Code Playgroud)
非常感谢提前。
PS:一些额外的解释将不胜感激,这将是一个很好的奖励,可以从中真正学到一些东西......
DataGrid 有一个ViewPort并且只会渲染和计算实际显示的内容。这就是所谓的虚拟化。取决于行/单元格数据的视觉变化将不可避免地导致“跳跃”,因为 DataGrid 会当场计算它们。
上的设置Scrollviewer以及将网格放入 中Scrollviewer,将禁用虚拟化。这意味着整个网格将立即渲染:
如果您的网格仅包含有限数量的行,这可能没问题。
解决这个问题的一个更好的方法是直接在ItemsSource. 使用ObservableCollection并在那里过滤数据。网格将根据ObservableCollection.
这正是您使用设置可见性的 RowStyle 重建的行为。