«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как изменить ObservableCollection из потока, не являющегося диспетчером, в WPF?

Как изменить ObservableCollection из потока, не являющегося диспетчером, в WPF?

Опубликовано 8 ноября 2024 г.
Просматривать:207

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

"Этот тип CollectionView не поддерживает изменения в исходной коллекции из потока, отличного от потока диспетчера"

Описание проблемы

Привязка к DataGrid в асинхронно заполненную ObservableCollection выдает ошибку, указывающую, что изменения в SourceCollection не разрешены из потока, не являющегося диспетчером.

Решение

Проблема возникает из-за сходства потоков. ObservableCollection изначально создается в потоке пользовательского интерфейса, что делает его доступным только из потока пользовательского интерфейса. Чтобы изменить его из другого потока, делегат должен быть помещен в диспетчер пользовательского интерфейса.

Обновленный код ViewModel

public void Load()
{
    matchList = new List();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

При вызове делегата в диспетчере пользовательского интерфейса дополнения к ObservableCollection планируются в потоке пользовательского интерфейса, разрешая исключение.

Расширенная привязка и обновление

Для асинхронного режима привязку и обновление DataGrid, рассмотрите возможность использования INotifyPropertyChanged в свойствах ViewModel и вызова Dispatcher для обновления элементов пользовательского интерфейса.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3