使用ObservableCollection作为Source更改(添加,删除)ICollectionView中的项目

时间:2013-07-12 11:02:15

标签: c# .net wpf entity-framework

我正在创建一个应用程序,使用过滤器和分页控件查看DataGrid中的数据库数据(数百万行)。

DataGrid

我通过EntityFramework 5在我的ViewModel中获取数据,并将DataGrid绑定到ICollectionView

<DataGrid ItemsSource="{Binding EntityView}"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          Sorting="OnSortingGrid"
          EnableRowVirtualization="True"
          VirtualizingStackPanel.IsVirtualizing="True"
          VirtualizingStackPanel.VirtualizationMode="Recycling">
    <DataGrid.Columns>
        ...
    </DataGrid.Columns>
</DataGrid>
如果Reload()PageFilterString发生变更,则会调用

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。我知道我可以随时将新的CollectionView设置为EntityView,但之后我会松开DataGrid上的排序。

有没有更好的方法来处理EntityFramework的这些东西?喜欢用延迟加载绑定整个事物,然后在CollectionView上设置过滤器?

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

1 个答案:

答案 0 :(得分:0)

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

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

...这将有助于您获得所需的信息。这消除了添加到List的临时步骤。根据内存需求,您可能希望在加载LCV后调整虚拟化参数,因为ItemsControlGenerator默认选择最新添加作为LCV的当前项。但这是性能与内存的选择。

关于如何让LCV知道基础列表是否发生变化的其他问题,您可以

SourceCollection.CollectionChanged+=MyHandler;

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