计算数据网格中可见行数

本文关键字:数据 数据网 网格 计算 | 更新日期: 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}}"/>