@capiev
Программист C#, WPF, python.

NotifyPropertyChanged — что пошло не так?

Есть GUI-приложение (DevExpress, WPF, C#) основанное на MVVM, которое было написано мной и работало, биндинги в контролах работали и проблем с ними не было. Но вдруг, что-то обновилось или что-то слетело или звезды сошлись не так, но биндинги адекватно работать перестали.
Попробую описать проблему.
Есть свойство Count некоторого класса реализующего интерфейс INotifyPropertyChanged.
Есть TextBlock, который по средствам Binding отображает значение этого свойство.
Есть кнопка №1, которая по средствам ICommand, асинхронно запускает процедуру сканирования папки на диске. В процессе происходит небольшой анализ файлов и подсчет количества с соответствующей инкрементацией свойства Count, которое в свою очередь посылает событие PropertyChanged. Вся процедура происходит асинхронно в Task.
Есть другая кнопка №2, созданная для теста, которая при нажатии просто инкрементирует это свойство Count, из главного потока.

При выполнении такой последовательности действий происходит что-то что я не могу понять:
  1. Нажимаем кнопку №2 (сколько угодно раз) - Count инкрементируется, TextBlock обновляется и отображает актуальное значение Count
  2. Далее нажимаем кнопку №1 - обновления не происходит. То есть события куда-то улетают или застревают по дороге
  3. Далее нажимаем снова кнопку №2 - Count инкрементируется, TextBlock теперь не обновляется. То есть события куда-то пропадают.


Что я попробовал для решения:
  • При запуске приложения на другой машине проблема повторяется
  • При переустановке VisualStudio и DevЕxpress проблема сохраняется
  • Поднял отдельную виртуальную машину с VS и DevExpress, собрал приложение там, но проблема не решилась

Есть подозрение, что поток диспетчеризирующий эти события приостанавливается (замораживается), но остальные контроллы, помимо этого TextBlock-а работают.... или PropertyDescriptor запутался.
Еще ньюансик: я добавлял трэйсинг в приложение по средства TraceSource, SourceSwith и прочего подобного. Но мне не хочется верить что проблема в этом, да и в режиме Release-сборки проблема остается.
  • Вопрос задан
  • 290 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Я бы воспользовался Dispatcher.BeginInvoke() для инкрементации Count из фонового потока.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы