代码之家  ›  专栏  ›  技术社区  ›  Dev

如何更新绑定到UI的集合?

  •  -1
  • Dev  · 技术社区  · 6 年前

    我跟踪了 this 斯蒂芬·克利里(StephenCleary)的博客,我想知道更新现有集合的最佳方法是什么,该集合绑定到每15秒更新一次的UI? 例如,是否清除列表,然后添加新集合以创建新对象?

    我问这个问题是因为当我添加这个 Task taskA = Task.Run(() => UpdateManifest(_ManifestToken.Token)); 代码行我的CPU快速增长。

    C#:

    // Ctor.
    public ManifestViewModel()
    {
        _ManifestItems = new NotifyTaskCompletion<ObservableCollection<ManifestItem>>(FetchData());
        Task taskA = Task.Run(() => UpdateManifest(_ManifestToken.Token));  
    }
    
    private NotifyTaskCompletion<ObservableCollection<ManifestItem>> _ManifestItems;
    public NotifyTaskCompletion<ObservableCollection<ManifestItem>> ManifestItems
    {
        get => _ManifestItems;
        set
        {
            if (_ManifestItems != value)
            {
                _ManifestItems = value;
                OnPropertyChanged();
            }
        } 
     }
    
    public static Task UpdateManifest(CancellationToken token)
    {
        while (true)
        {
            _ManifestItems = new NotifyTaskCompletion<ObservableCollection<ManifestItem>>(FetchData());
    
            Task.Delay(15000);
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   mm8    6 年前

    您应该在后台线程上获取数据,并在UI线程上更新源集合。您也可以使用 BindingOperations.EnableCollectionSynchronization 方法允许从后台线程更新数据绑定集合。

    比打电话更好的方式 Updatemanifest 并使用 while (true) 循环将使用 Timer 以给定的间隔获取数据,例如:

    private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        var data = FetchData();
    
        //either just set a source property to the fetched data collection
        SourceCollectionProperty = data;
    
        //...or update the collection
    
    }