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

时间:2018-05-16 09:47:37

标签: wpf mvvm

我跟踪了Stephen Cleary的this博客,我想知道更新现有集合的最佳方法是什么,该集合限制在每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 个答案:

答案 0 :(得分:1)

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

比从构造函数调用ViewModel并使用Updatemanifest循环更好的方法是使用Timer以给定的时间间隔获取数据,例如:

while (true)