【问题标题】:Wpf DataGrid: how to detect the set of visible cells?Wpf DataGrid:如何检测可见单元格集?
【发布时间】:2019-12-01 05:02:27
【问题描述】:

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

【问题讨论】:

  • 看看 wpf 数据虚拟化,有一些有用的文章 herehere

标签: c# wpf sorting scroll datagrid


【解决方案1】:

我最终得到了这个解决方案: 监听 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 => { });
                }
            }
        }
    }

【讨论】:

  • 我希望 ItemViewModel 不加载任何类型的位图?!人们通常会在 xaml 中使用转换器来加载所述图像。如果您的 ViewModel 引用了任何 UI 元素或类型,则它不再是 MVVM。并且虚拟化是要走的路,这个解决方案可能有效(尽管有 WinForms 的味道),但它更像是一种 hack,而不是解决您的问题。
【解决方案2】:

尝试将EnableDataVirtualization="True" 设置为DataGrid

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多