OnPropertyChanged with List

时间:2010-09-27 20:39:17

标签: wpf mvvm

我在视图中有一个绑定到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();
}

1 个答案:

答案 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);
    }
}