Как обновить коллекцию, которая привязана к пользовательскому интерфейсу? - PullRequest
0 голосов
/ 16 мая 2018

Я следил за этим блогом Стивена Клири, и мне было интересно, как лучше всего обновить существующую коллекцию, привязанную к пользовательскому интерфейсу, который обновляется каждые 15 секунд?Например, я могу очистить список, а затем добавить новую коллекцию для создания нового объекта?

Я задаю этот вопрос, потому что когда я добавил эту строку кода Task taskA = Task.Run(() => UpdateManifest(_ManifestToken.Token));, мой ЦП быстро увеличивался.

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 голосов
/ 16 мая 2018

Вы должны получить данные в фоновом потоке и обновить исходную коллекцию в потоке пользовательского интерфейса. Вы также можете использовать метод BindingOperations.EnableCollectionSynchronization , позволяющий обновлять коллекцию с привязкой к данным из фонового потока.

Лучше, чем вызывать Updatemanifest из вашего конструктора и использовать цикл while (true), это использовать Таймер , который выбирает данные с заданными интервалами, например ::

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...