Есть следующая конструкция:
есть класс Frame, реализующий INotifyPropertyChanged, и отсылающий уведомления если изменилось свойство Progress (прогресс обработки от 0 до 100).
Есть коллекция BindingList<Frame>, и есть привязанный к ней ListBox с OwnerDrawFixed.
Есть код, подписывающийся на события от BindingList<Frame>, и запускающий BackgroundWorker для новых элементов. Код, завернутый в BackgroundWorker, использует BackgroundWorker.OnProgressChanged для задания нового значения Frame.Progress.
Какое поведение я ожидал:
1. Код обработки вызывает BackgroundWorker.ReportProgress(x)
2. Обработчик события BackgroundWorker.OnProgressChanged изменяет свойство соответствующего экземпляра Frame.Progress.
3. Экземпляр Frame кидает OnPropertyChanged, уведомляя BindingList. Событие гененрируется в потоке GUI, я проверял.
4. BindingList ретранслирует событие как ListChanged, уведомляя ListBox об изменениях. Это встроенная функциональность BindingList.
5. ListBox инициирует перерисовку соответствующего элемента.
Пункты 1-4 работают прекрасно, а вот с пунктом 5 возникает заминка, и ListBox не перерисовывается.
Как это можно исправить?
Сейчас я просто подписался на BindingList.ListChanged, и дергаю
ListBox.Invalidate(ListBox.GetItemRectangle(e.NewIndex));
если элемент изменяется, но это выглядит как костыль.