44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
|
||||||||||||||||
1 | ||||||||||||||||
WPF Обновление ListBox при биндинге данных05.12.2018, 11:33. Показов 5220. Ответов 8
Метки нет (Все метки)
Доброго всем дня!
Есть задача обновлять список на "морде" программы данными из фонового потока. к Листбоксу прибиндена коллекция
Сначала думал, что проблема в потоках. Посему решил делать это используя диспетчер, но и это не помогло. Просто создал таймер в основном потоке, который раз в секунду должен добавлять новую запись в список и это не работает. Добавил в таймер работу через диспетчер и оно так же не работает. Вот последний вариант кода:
Может кто-нибудь подсказать, что я делаю не так?
0
|
05.12.2018, 11:33 | |
Ответы с готовыми решениями:
8
DataTrigger: Path при биндинге не распознается При биндинге ComboBox выводится не то значение Обновление данных в ListBox, или ComboBox Ошибка при биндинге элементов формы к значениям |
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
||||||
05.12.2018, 13:07 | 2 | |||||
1. ваш MainController должен реализовывать InotifyPropertyChanged
2. для того, чтобы интерфейс синхронно обновлялся с коллекцией, нужно использовать ObservableCollection для вашего примера было бы примерно так:
0
|
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
|
|
05.12.2018, 13:20 [ТС] | 3 |
hamin, к сожалению это не работает.
Я не написал про INotifyPropertyChanged, потому что думал, что это очевидно. Коллекцию же я менял с листа на ObservableCollection и обратно. Эффект один и тот же. Обновление ситуации: после попытка обновить что-нибудь в окне, если коллекция уже изменена, ломлю исключение: объект itemscontrol не соответствует своему источнику элементов
0
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
|
05.12.2018, 13:44 | 4 |
к сожалению большого опыта использования потоков у меня нет, но предполагаю, что проблема в том, что объект коллекции и ее обновление происходят в разных потоках
p.s. тут поковырялся чуток и если создавать и обновлять коллекцию в одном потоке, то все прекрасно работает и листбокс обновляется в задержкой 2 сек
0
|
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
|
||||||
05.12.2018, 13:48 [ТС] | 5 | |||||
hamin, это была моя первая мысль. В конце концов я создал новый проект и там повторил интерфейс и работу с ним, но избавился от потоков как таковых.
Простые строчные поля типа TextBlock обновляются прекрасно, листбокс же игнорируется. В конце концов решил проблему самолично подписавшись на PropertyChanged и там вызываля у листбокса
0
|
879 / 558 / 291
Регистрация: 21.11.2012
Сообщений: 1,553
|
|
05.12.2018, 13:53 | 6 |
Сообщение было отмечено NapalmRain как решение
Решение
NapalmRain,
1
|
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
|
|
05.12.2018, 14:20 [ТС] | 7 |
hamin, Благодарю!
Разобрался в чём была причина. На самом деле намудрил с потоками. Всё дело в невнимательности. Если вдруг у кого-то будет подобные проблемы, вот в чём косяк был у меня: Коллекция действительно должна быть ObservableCollection, но менять её надо обязательно в текущем потоке, например через диспетчер окна. Я же в пылу поиска ошибки удалил этот кусок и менял в фоновом потоке, из-за чего и ловил кучу ошибок. А когда переписал всё с нуля ObservableCollection уже не использовал, так как убедил себя в том, что разницы нет
1
|
Модератор
|
|
05.12.2018, 14:20 | 8 |
Если Вы меняете количественно коллекцию источника ListBox, то эта коллекция должна поддерживать интерфейс INCC (не путать с INPC). List - этот интерфейс не поддерживает, также List не относится к потокобезопасным коллекциям. Обновление изменение List должно происходить в одном потоке.
Из простых коллекций INCC поддерживает ObservableCollection.
1
|
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
|
|
05.12.2018, 14:40 [ТС] | 9 |
Элд Хасп, Благодарю, полезно
0
|
05.12.2018, 14:40 | |
05.12.2018, 14:40 | |
Помогаю со студенческими работами здесь
9
Не работает преобразование значений при биндинге (IValueConverter) Плавное движение слайдера при TwoWay биндинге WPF При копирование одинаковых данных меж ListBox, проверять и выдавать сообщение о совпадении данных Обновление данных в модели Linq to SQL при обновлении данных в БД Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |