Элегантная обработка изменения коллекции, которая требует изменений в потоке диспетчера - PullRequest
1 голос
/ 23 июля 2010

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

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

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

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

ПРИМЕЧАНИЕ:

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

Ответы [ 2 ]

1 голос
/ 23 июля 2010

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

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

1 голос
/ 23 июля 2010

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

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

...