Wpf OnProperty已更改为列表
我在视图中有一个数据网格,它绑定到viewmodel中的列表。我有很多数据要为列表检索,所以我想把它分成许多小的检索,而不是一个大的检索 我希望这种情况发生在后台线程上,在检索到的每个批处理结束时,UI都会更新(绑定新数据的网格) 在每次检索结束时,我在私有后台执行List.AddRange(),然后引发OnPropertyChanged事件,传递网格绑定到的公共属性的名称 最初我尝试了6次迭代,每次迭代检索100个项目。在后台运行时,UI将在前100个之后更新,但不会更新最后500个(即使数据已成功添加到viewmodel中的基础列表) 考虑到我在编组到UI线程时遇到了一些问题,我同步运行了它,希望它能按预期工作(尽管在每次检索期间阻塞UI)或在所有检索期间阻塞UI,但无论哪种情况,最后都会更新以显示600项。然而,当我在后台运行它时,它会做同样的事情——只更新前100个,而不更新其余的 下面是我在两次尝试中使用的方法,上半部分是注释掉的背景版本 我做错了什么Wpf OnProperty已更改为列表,wpf,mvvm,Wpf,Mvvm,我在视图中有一个数据网格,它绑定到viewmodel中的列表。我有很多数据要为列表检索,所以我想把它分成许多小的检索,而不是一个大的检索 我希望这种情况发生在后台线程上,在检索到的每个批处理结束时,UI都会更新(绑定新数据的网格) 在每次检索结束时,我在私有后台执行List.AddRange(),然后引发OnPropertyChanged事件,传递网格绑定到的公共属性的名称 最初我尝试了6次迭代,每次迭代检索100个项目。在后台运行时,UI将在前100个之后更新,但不会更新最后500个(即使数据
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();
}
public void StartDataStream()
{
//Task Task=\u taskFactory.StartNew(this.\u retrieveData);
//task.ContinueWith(t=>
//{
//如果(this.\u cars==null)this.\u cars=new List();
//此._cars.AddRange(t.Result);
//基于财产变更(“汽车”);
//这个迭代次数+=1;
//如果(迭代次数<6)StartDataStream();
//});
如果(this.\u cars==null)this.\u cars=new List();
this._cars.AddRange(this.GetCarList(eq,s,e));
基于财产变更(“汽车”);
这个迭代次数+=1;
如果(迭代次数<6)StartDataStream();
}
您是否尝试过使用可观察收集
而不是列表
我想你有一个叫做汽车的公共财产类似于
public List<Car> Cars{
get { return this._cars;}
set
{
this._cars = value;
base.OnPropertyChanged("Cars");
}
}
实际上,我考虑过,但没有尝试,因为在ObservaleCollection上缺少AddRange方法。除了用AddRange实现我自己的ObservableCollection之外,我还担心UI在每个项目上的更新性能,而不是每100个项目。我在使用
列表时遇到了一些问题,而不是使用Observable
,当我切换时,它似乎发挥得更好。列表
类型未实现INotifyCollectionChanged
,其中可观察
实现了它。我会试一试,看看它是否对你有影响。是的,一次可观察的收集值得一试——我现在就试试。关于公共属性,是的,我的看起来和你的一模一样-抱歉,我应该在我的示例中包括这一点。这很酷,只是想确保你在那里进行双重检查:)好的,所以使用ObservableCollection,使用同步方法,在所有迭代完成后,UI更新为600然后我用任务方法做了同样的事情,从来没有得到过任何UI更新(即使是前100个),所以也许我离这更近了一步,现在我真的有了UI线程的编组问题?
public static class Extensions
{
public static void AddRange(this ObservableCollection obj, List<T> items)
{
foreach (var item in items)
obj.Add(item);
}
}