我正在创建一个应用程序,使用过滤器和分页控件查看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
已经改变了?
答案 0 :(得分:0)
您可以直接将实体列表添加到ListCollectionView ...
ListCollectionView EntityView = new ListCollectionView(new List<ProductShipment>);
foreach (var entity in entitylist)
{
EntityView.AddNewItem(entity);
}
EntityView.CommitNew();
OnPropertyChanged("EntityView");
...这将有助于您获得所需的信息。这消除了添加到List的临时步骤。根据内存需求,您可能希望在加载LCV后调整虚拟化参数,因为ItemsControlGenerator默认选择最新添加作为LCV的当前项。但这是性能与内存的选择。
关于如何让LCV知道基础列表是否发生变化的其他问题,您可以
SourceCollection.CollectionChanged+=MyHandler;
实现处理程序以获取更改......