Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf OnProperty已更改为列表_Wpf_Mvvm - Fatal编程技术网

Wpf OnProperty已更改为列表

Wpf OnProperty已更改为列表,wpf,mvvm,Wpf,Mvvm,我在视图中有一个数据网格,它绑定到viewmodel中的列表。我有很多数据要为列表检索,所以我想把它分成许多小的检索,而不是一个大的检索 我希望这种情况发生在后台线程上,在检索到的每个批处理结束时,UI都会更新(绑定新数据的网格) 在每次检索结束时,我在私有后台执行List.AddRange(),然后引发OnPropertyChanged事件,传递网格绑定到的公共属性的名称 最初我尝试了6次迭代,每次迭代检索100个项目。在后台运行时,UI将在前100个之后更新,但不会更新最后500个(即使数据

我在视图中有一个数据网格,它绑定到viewmodel中的列表。我有很多数据要为列表检索,所以我想把它分成许多小的检索,而不是一个大的检索

我希望这种情况发生在后台线程上,在检索到的每个批处理结束时,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();
}
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);
    }
}