代码之家  ›  专栏  ›  技术社区  ›  Mark Bostleman

OnPropertyChanged与列表

  •  0
  • Mark Bostleman  · 技术社区  · 14 年前

    我希望在后台线程上发生这种情况,在检索到的每个批处理结束时更新UI(绑定新数据的网格)。

    每次检索结束时,我都要做一个列表.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 回复  |  直到 14 年前
        1
  •  1
  •   Gabe    14 年前

    ObservableCollection<T> 而不是一个 List<T>

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