0

我正在制作一个应用程序来查看DataGrid带有过滤器和分页控件的数据库数据(数百万行)。

数据网格

我通过 EntityFramework 5 在我的 ViewModel 中获取数据并将其绑定DataGridICollectionView.

<DataGrid ItemsSource="{Binding EntityView}"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          Sorting="OnSortingGrid"
          EnableRowVirtualization="True"
          VirtualizingStackPanel.IsVirtualizing="True"
          VirtualizingStackPanel.VirtualizationMode="Recycling">
    <DataGrid.Columns>
        ...
    </DataGrid.Columns>
</DataGrid>

Reload()如果Page或被改变FilterString则调用SortString

public ObservableCollection<ProductShipment> SourceCollection
{
    get { return _sourceCollection }
    set { _sourceCollection = value; OnPropertyChanged("SourceCollection"; }
}
private ObservableCollection<ProductShipment> _sourceCollection;

public async void ReloadData()
{
    if (Context == null)
        Context = new DatabaseContext();

    await Task.Run(
        () =>
            {
                // Current set is something like
                var entitylist = Context.Where(FilterString)
                                        .OrderBy(SortString)
                                        .Skip(PageSize * Page)
                                        .Take(PageSize).ToList();

                if (SourceCollection == null)
                   SourceCollection = new ObservableCollection<ProductShipment>();

                Application.Current.Dispatcher.Invoke(
                    () =>
                        {
                            SourceCollection.Clear();

                            foreach (var entity in entitylist)
                            {
                               SourceCollection.Add(entity);
                            }

                            if (EntityView == null)
                            {
                                EntityView = new ListCollectionView(SourceCollection);
                            }

                            // Do Grouping if there is a Grouping Definition
                            ...
                        }, DispatcherPriority.DataBind);
            });

    //Exception/Success handling etc.
}

但是 中的变化SourceCollection不影响CollectionView. 我知道我总是可以为 分配一个新CollectionViewEntityView,但是我会松开 DataGrid 上的排序。

有没有更好的方法来使用 EntityFramework 处理这些东西?就像用延迟加载绑定整个东西,然后在CollectionView?

或者有没有办法让EntityView知道SourceCollection已经改变了?

4

1 回答 1

0

您可以将实体列表直接添加到 ListCollectionView...

        ListCollectionView EntityView = new ListCollectionView(new List<ProductShipment>);
        foreach (var entity in entitylist)
        {
            EntityView.AddNewItem(entity);
        }
        EntityView.CommitNew();
        OnPropertyChanged("EntityView");

...这将有助于得到你所追求的。这消除了添加到列表的中间步骤。根据内存需求,您可能希望在加载 LCV 后调整虚拟化参数,因为 ItemsControlGenerator 默认情况下会选择最近添加的内容作为 LCV 的当前项。但这是性能与内存的选择。

对于您关于如何让 LCV 知道基础列表是否已更改的其他问题,您可以

SourceCollection.CollectionChanged+=MyHandler;

并实现处理程序以获取更改...

于 2013-07-12T11:23:00.333 回答