我正在制作一个应用程序来查看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
的EntityView
,但是我会松开 DataGrid 上的排序。
有没有更好的方法来使用 EntityFramework 处理这些东西?就像用延迟加载绑定整个东西,然后在CollectionView
?
或者有没有办法让EntityView
知道SourceCollection
已经改变了?