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()
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
。CollectionView
私はいつでも newをに割り当てることができることを知っていEntityView
ますが、そうすると DataGrid のソートが失われます。
EntityFramework でこれを処理するより良い方法はありますか? 全体を遅延読み込みでバインドしてから、CollectionView
?
または、変更されたことをEntityView
知らせる方法はありSourceCollection
ますか?