我在视图中有一个绑定到viewmodel中List的数据网格。我要为列表检索大量数据,所以我想把它分解成许多小的检索而不是一个大的检索。
我希望在发现的每个批次结束时,在更新UI(绑定新数据的网格)的后台线程上发生这种情况。
在每次检索结束时,我在私有支持者上执行List.AddRange(),然后引发OnPropertyChanged事件,传递网格绑定的公共属性的名称。
最初我尝试了6次迭代,每次迭代检索100个项目。在后台运行时,UI将在前100个之后更新,但之后不会更新最后500个(即使数据已成功添加到viewmodel中的基础列表中)。
认为我在编组UI线程时遇到了一些问题,我按顺序运行它,期望它按预期工作(虽然在每次检索期间阻止UI)或在所有检索期间阻止UI - 但在任何一种情况下,最后更新显示600项。但是,它最终会像我在后台运行时那样做 - 只更新前100个而不是其余的。
下面是我在两次尝试中使用的方法,上半部分是后面的注释版本。
我做错了什么?
public void StartDataStream()
{
//Task<List<Car>> task = _taskFactory.StartNew(this._retrieveData);
//task.ContinueWith(t =>
//{
// if (this._cars == null) this._cars = new List<Car>();
// this._cars.AddRange(t.Result);
// base.OnPropertyChanged("Cars");
// this.iterations += 1;
// if (iterations < 6) StartDataStream();
//});
if (this._cars == null) this._cars = new List<Car>();
this._cars.AddRange(this.GetCarList(eq,s,e));
base.OnPropertyChanged("Cars");
this.iterations += 1;
if (iterations < 6) StartDataStream();
}
答案 0 :(得分:1)
您是否尝试使用ObservableCollection<T>
而不是List<T>
我假设您有一个名为Cars的公共财产,类似于......
public List<Car> Cars{
get { return this._cars;}
set
{
this._cars = value;
base.OnPropertyChanged("Cars");
}
}
如果不是,这实际上不会做任何事...... base.OnPropertyChanged("Cars")
;
AddRange
ObservableCollection
public static class Extensions
{
public static void AddRange(this ObservableCollection obj, List<T> items)
{
foreach (var item in items)
obj.Add(item);
}
}