0

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は影響しませんCollectionViewCollectionView私はいつでも newをに割り当てることができることを知っていEntityViewますが、そうすると DataGrid のソートが失われます。

EntityFramework でこれを処理するより良い方法はありますか? 全体を遅延読み込みでバインドしてから、CollectionView?

または、変更されたことをEntityView知らせる方法はありSourceCollectionますか?

4

1 に答える 1