检查DataGrid中的Item是否已在视图中

时间:2015-04-16 10:09:36

标签: c# wpf datagrid

我有一个DataGrid ItemsSource绑定到ObservableCollection<LogEntry>。单击Button,用户可以滚动到特定的LogEntry。因此,我使用以下代码:

private void BringSelectedItemIntoView(LogEntry logEntry)
{
    if (logEntry != null)
    {
        ContentDataGrid.ScrollIntoView(logEntry);
    }
}

这很好用。但我不喜欢的是:如果LogEntry已经在视图中,那么DataGrid很快就会闪烁。

我现在的问题是:

如果给定的LogEntry已经在视图中,是否有可能检查DataGrid

1 个答案:

答案 0 :(得分:1)

您可以获取第一个可见项目和最后一个可见项目的索引

然后你可以检查你的项目的索引是否在第一个和最后一个之内。

var verticalScrollBar = GetScrollbar(DataGrid1, Orientation.Vertical);
var count = DataGrid1.Items.Count;
var firstRow = verticalScrollBar.Value;
var lastRow = firstRow + count - verticalScrollBar.Maximum;

// check if item index is between first and last should work

获取Scrollbar方法

private static ScrollBar GetScrollbar(DependencyObject dep, Orientation orientation)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++)
        {
            var child = VisualTreeHelper.GetChild(dep, i);
            var bar = child as ScrollBar;
            if (bar != null && bar.Orientation == orientation)
                return bar;
            else
            {
                ScrollBar scrollBar = GetScrollbar(child, orientation);
                if (scrollBar != null)
                    return scrollBar;
            }
        }
        return null;
    }