Изящная обработка Изменения Набора, которое требует изменений на потоке диспетчера

Вот моя ситуация:

У меня есть пользовательский интерфейс ItemsControl "ResultsPresenter" (WPF) получение по запросу от ListCollectionView, который использует BindingList "Результаты" от класса non-UserInterface как ListCollectionView. Свойство Source.

Каждый раз, когда я вношу изменение в "Результаты", такие как добавить операция, я получаю NotSupportedException, настаивая, что {"Этот тип CollectionView не поддерживает изменения в своем SourceCollection от потока, отличающегося от потока Диспетчера".}

Выглядит, как будто эта ошибка прибывает из набора "Результатов", но информация об ошибке кажется отчетливо сгенерированным WPF. Я хотел бы знать, почему я бросаю эту ошибку, и как разрешить его, не выставляя класс, который содержит "Результаты" к WPF связанный код.

Примечание:

Это решение появилось после того, как оно вызывало эту ошибку при рассмотрении непосредственно свойства "Results" для привязки, ListCollectionView был только представлен, чтобы попытаться исправить эту ситуацию и более, чем вероятен не часть проблемы.

1
задан Firoso 23 July 2010 в 16:05
поделиться

2 ответа

Это известная проблема с уведомлениями об изменении коллекции, так как WPF назывался Avalon. См. Сообщение в блоге Беа Штольниц по этой теме.

Вы можете довольно легко обойти это, внося изменения коллекции в поток диспетчера. Поскольку я предполагаю, что у вас есть длительная операция, возвращающая элементы или изменения, я бы рекомендовал изучить Rx и использовать параметр ObserveOnDispatcher для IObservable. Rx в целом делает подобные вещи намного проще, чем это было в прошлом.

1
ответ дан 2 September 2019 в 22:48
поделиться

Событие, вызванное вашей коллекцией результатов, обрабатывается ListCollectionView для уведомления пользовательского интерфейса. Если это происходит в потоке, не относящемся к пользовательскому интерфейсу, вы получаете это исключение.

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

1
ответ дан 2 September 2019 в 22:48
поделиться
Другие вопросы по тегам:

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