计算DataGrid中可见行的数量

时间:2011-05-12 14:46:15

标签: c# .net wpf datagrid .net-4.0

我想知道WPF DataGrid实际显示了多少行。

我尝试循环DataGridRow并检查IsVisible,但即使这些行不在IsVisible = true视口中,行似乎也会报告DataGrid

如何正确计算可见行数?

4 个答案:

答案 0 :(得分:1)

我也在MSDN论坛上问了这个问题,得到了good answer

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);
}

答案 1 :(得分:1)

我的行显示为Visible = true时出现同样的问题,即使他们不是。

尝试提出解决方案,我发布了这个问题:Visible rows in DataGrid is off by 1 (counted using 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 */,以及一个用户对问题本身的评论的线索,导致了答案。

答案 2 :(得分:0)

想到一个简单的黑客,

遍历所有行并检查项目是否有容器?

dataGrid.GetContainerFromItem(dataGrid.Items[row]);

希望这会有所帮助

答案 3 :(得分:0)

如果您需要它用于另一个 xaml 元素,只需通过“ElementName”和“Items.Count”属性添加一个引用到您的内容属性(在本例中为“Text”)。您也可以使用转换器来解析值。

<TextBlock Text="{Binding ElementName=ComponentDataGrid, Path=Items.Count, Converter={StaticResource IntToStringConverter}}"/>