2013-07-12 2 views
0

Я делаю приложение для просмотра данных базы данных (много миллионов строк) в DataGrid с помощью фильтра и пейджингового управления.Изменено (Добавить, Удалить) Элементы в ICollectionView с ObservableCollection как источник

DataGrid

Я получаю данные в моем 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?

Или есть способ, чтобы сообщить EntityViewSourceCollection?

+0

Что такое ObservableCollection является ваш код? – ncourcy84

+0

SourceCollection, теперь я добавил его к примеру, так что это яснее – Staeff

+0

Еще один момент: вы не должны делать SourceCollection.Clear(). Вместо этого обрабатывайте удаление предметов. И не нужно внедрять INotifyPropertyChanged, поскольку вы используете ObservableCollection. ObservableCollection реализует для вас INotifyPropertyChanged. – ncourcy84

ответ

0

Вы можете добавить список лиц, непосредственно к ListCollectionView ...

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

... и это поможет получить то, что вы после этого. Это устраняет промежуточный шаг добавления в список. В зависимости от потребности в памяти вы МОЖЕТЕ хотеть настроить параметры виртуализации ПОСЛЕ загрузки LCV, потому что ItemControlGenerator по умолчанию будет выбирать самое последнее добавление в качестве текущего элемента LCV. Но это выбор производительности и памяти.

Для другого вопроса о том, чтобы позволить LCV знать, если основной список изменился, вы можете

SourceCollection.CollectionChanged+=MyHandler; 

и реализовать обработчик, чтобы получить изменения ...

+0

Выглядит многообещающе, я попробую это! – Staeff

+0

Это работает даже без 'OnPropertyChanged', но DataGrid теряет сортировку при выполнении команды CommitNew() – Staeff

+0

. Вам нужно добавить обработчик сортировки на ваш вопрос. –

Смежные вопросы