c# - Wpf 数据网格 : how to detect the set of visible cells?

标签 c# wpf sorting scroll datagrid

我有一个 Wpf DataGrid,用户可以通过单击任何标题进行排序,然后滚动。 有些单元格需要显示图像,但我想避免在填充 DataGrid 时加载所有图像。相反,我希望仅在图像进入视野时才加载图像。 当单元格进入 View 时如何通知我,以及如何获取其绑定(bind)项?

最佳答案

我最终得到了这个解决方案: 监听 DataGrid 的 ScrollViewer.ScrollChanged 事件:

<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged">

然后,使用 scrollviewer 属性检测可见行;最后使用 DataGrid 的 ItemContainerGenerator 来获取与感兴趣的每一行关联的项目。

    private static T GetChildOfType<T>(DependencyObject depObj)
        where T : DependencyObject
    {
        if (depObj == null) return null;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            var child = VisualTreeHelper.GetChild(depObj, i);

            var result = (child as T) ?? GetChildOfType<T>(child);
            if (result != null) return result;
        }
        return null;
    }

    private void DataGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        var scroll = GetChildOfType<ScrollViewer>((DependencyObject)sender);
        int firstRow = (int)scroll.VerticalOffset;
        int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;
        DataGrid datagrid = sender as DataGrid;
        for (int i = firstRow; i < lastRow; i++)
        {
            var row = datagrid.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
            if (row != null)
            {
                var item = row.DataContext;
                ItemViewModel viewModel = item as ItemViewModel;
                if (viewModel != null)
                {
                    viewModel.LoadImages().ContinueWith(t => { });
                }
            }
        }
    }

关于c# - Wpf 数据网格 : how to detect the set of visible cells?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57159243/

相关文章:

wpf - 使用 Linq to Entities 绑定(bind)到 List<T> 时显示组合框的选定值的问题

wpf - 如何向控件模板/样式添加新属性

c# - 使用带有自定义排序的 linq 对字符串列表进行排序

c# - IntegratedWindowsAuthentication 与协商有什么区别?

c# - 使用正则表达式查找函数的最佳方法?

c# - 对属性的 Json DeserializeObject 运行转换

c# - 从堆栈中获取所有引用和值

.net - 在 WPF/Silverlight ListBox 中的项目之间添加空格,第一个上方或最后一个下方没有空格

mysql - 更改 mysql 的默认排序行为

C - 按零件编号升序显示零件