wpf mvvm threading.Timer и TimerCallback проблемы - PullRequest
0 голосов
/ 10 мая 2011

У меня есть приложение WPF, разработанное на основе инфраструктуры MVVM, в которой конструктор ViewModel устанавливает Timer с TimerCallback.

TimerCallback извлекает ObservableCollection и передает его в поле на виртуальной машине.

У меня есть CollectionViewSource, у которого свойство Source установлено в ObservableCollection.Я использую CollectionViewSource, потому что я хочу включить фильтрацию для Collection.

Я обнаружил, что когда TimerCallback пытается передать ObservableCollection в локальное поле, свойство Source для CollectionViewSource имеет исключительную ситуацию {"Вызывающийпоток не может получить доступ к этому объекту, потому что другой поток владеет им. "}.

Я понимаю исключение, но у меня есть две проблемы:

  1. Как обойти эту проблему?
  2. И что более важно, почему я получаю эту проблему только при использовании CollectionViewSource?Если я удалю CollectionViewSource и сделаю ObservableCollection открытым свойством, я не получу такого исключения.

Любая помощь приветствуется!Спасибо, Драмми

Ответы [ 2 ]

2 голосов
/ 10 мая 2011
  1. Используйте DispatcherTimer вместо класса таймера, который вы используете сейчас, и убедитесь, что вы создаете его в потоке пользовательского интерфейса.
  2. Возможно, только с ObservableCollection ваш пользовательский интерфейс не обновляется.
1 голос
/ 10 мая 2011

Чтобы частично ответить на ваш вопрос, любые обновления ObservableCollection, которые могут наблюдаться элементами пользовательского интерфейса, должны отправляться через поток пользовательского интерфейса. Когда я хочу сделать это в MVVM, моя стратегия заключается в том, чтобы вставить SynchronizationContext в конструктор ViewModel, который я инициализирую во время запуска моего приложения. Это дает мне независимый от View-View способ отправки обновлений, которые должны быть синхронизированы с View.

...