计算数据网格中可见行数
本文关键字:数据 数据网 网格 计算 | 更新日期: 2023-09-27 17:56:20
我想知道WPF DataGrid
实际显示多少行。
我尝试循环遍历DataGridRow
并检查IsVisible
,但似乎行即使不在DataGrid
视口中也会报告IsVisible = true
。
如何正确计算可见行数?
我也在MSDN论坛上问过这个问题,并得到了很好的答案:
private bool IsUserVisible(FrameworkElement element, FrameworkElement container) {
if (!element.IsVisible)
return false;
Rect bounds = element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight));
Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight);
}
即使行不是,我也遇到了同样的问题,行显示为Visible = true
。
为了提出解决方案,我发布了这个问题:DataGrid 中的可见行偏差为 1(使用 ContainerFromItem 计数)。
以下是对我有用的方法:
uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");
foreach(var Item in TicketGrid.Items) {
var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);
if(Row != null) {
if(Row.TransformToVisual(TicketGrid).Transform(new Point(0, 0)).Y + Row.ActualHeight >= TicketGrid.ActualHeight) {
break;
}
VisibleRows++;
}
}
为了进一步的指导,我的回答中有一些关于链接问题的/* comments */
,以及导致答案的问题本身的用户评论。
一个简单的
技巧浮现在脑海中,
遍历所有行并检查项目是否有容器?
dataGrid.GetContainerFromItem(dataGrid.Items[row]);
希望这有帮助
如果你需要它用于另一个 xaml 元素,只需通过"ElementName"添加一个引用,并通过"Items.Count"将属性添加到你的内容属性(在本例中为"文本")。还可以使用转换器来分析值。
<TextBlock Text="{Binding ElementName=ComponentDataGrid, Path=Items.Count, Converter={StaticResource IntToStringConverter}}"/>