none
怎么在一个线程中对ListView的数据进行实时更新?以及如何打断实时更新的线程? RRS feed

  • 问题

  • class DataModel
    {
         public string Id
         {
            set;
            get;
         }
         public string Name
         {
            set;
            get;
         }
    
    }
    
    public void loadData(object obj) //该方法在ViewModel对象中 
    {
          for(int i=0;i<100;i++){
                  DataModel a=new DataModel ()
                  a.Id=""+i;
                  ItemArray.add(a);  //ItemArray是Observablecollection<T>类型。是ListView绑定的数据集合
          }
          ti=new Task(()=>{
                   int i=0;
                    foreach(var a in ItemArray)
                       {
                              a.Name="数据"+i;
                              thread.sleep(2000);
                              i++;
                             //每循环一次,listview就更新一次。怎么做?
                       }
         });
    }

    如上图代码所示,先加载每个DataModel的id属性,

    然后怎么在一个线程中实时更新每个DataModel的Name属性?

    以及如何打断实时更新的线程?直接将线程ti赋值null还是?





    2017年3月13日 4:08

答案


  • Hi 便携式家园,

    >>然后怎么在一个线程中实时更新每个DataModel的Name属性?

    我建议你实现 DataModel 的 INotifyPropertyChanged 接口。这样,只要你的 Name 值一改变,你的listview就对应更新。

    class NotificationProcess : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void RaisePropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    
        class ProcessModel : NotificationProcess
        {
            private string _pName = "ProcessBar1";
            public string PName
            {
                get { return _pName; }
                set
                {
                    _pName = value;
                    this.RaisePropertyChanged("PName");
                }
            }
        }


    >>以及如何打断实时更新的线程?直接将线程ti赋值null还是?

    你可以使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制。而CancellationTokenSource则是外部对Task的控制,如取消。

           CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
                new Task(() => {
                    int i = 0;
                    foreach (var a in ItemArray)
                    {
                        a.Name = "数据" + i;
                        thread.sleep(2000);
                        i++;
                        //每循环一次,listview就更新一次。怎么做?
                    }
                }, cancelTokenSource);
    
                cancelTokenSource.Cancel();
    


    Best Regards,

    Yohann Lu



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月13日 7:01
    版主