Я делаю приложение для просмотра данных базы данных (много миллионов строк) в DataGrid
с помощью фильтра и пейджингового управления.Изменено (Добавить, Удалить) Элементы в ICollectionView с ObservableCollection как источник
Я получаю данные в моем ViewModel через EntityFramework 5 и связать 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
до EntityView
, но потом я потерял бы Сортировку на DataGrid.
Есть ли лучший способ справиться с этим материалом с помощью EntityFramework? Как привязать все это с ленивой загрузкой, а затем установить фильтры на CollectionView
?
Или есть способ, чтобы сообщить EntityView
SourceCollection
?
Что такое ObservableCollection является ваш код? – ncourcy84
SourceCollection, теперь я добавил его к примеру, так что это яснее – Staeff
Еще один момент: вы не должны делать SourceCollection.Clear(). Вместо этого обрабатывайте удаление предметов. И не нужно внедрять INotifyPropertyChanged, поскольку вы используете ObservableCollection. ObservableCollection реализует для вас INotifyPropertyChanged. – ncourcy84