2010-09-30 4 views
6

Есть ли какие-либо потенциальные проблемы с обновлением свойств интерфейса ViewModel от Фонового работника? Я пытаюсь обновить виртуальную машину, пока она связана с пользовательским интерфейсом, и потенциально пользователи могут вводить текст. Как работает синхронизация здесь (я не думаю, что могу использовать инструкции Lock из XAML).WPF MVVM Обновление пользовательского интерфейса Связанные свойства из BackgroundWorker

Заранее спасибо ..

ответ

3

При обновлении скалярных свойств вам не нужно беспокоиться об этом в потоке пользовательского интерфейса. Событие PropertyChanged автоматически сортируется по потоку пользовательского интерфейса.

Однако не будет работать для коллекций, которые реализуют INotifyCollectionChanged. Событие CollectionChanged не будет привязано к потоку пользовательского интерфейса, и это вызовет исключение. Поэтому, если вы изменяете коллекцию, привязанную к ItemsControl, вам нужно использовать Dispatcher.Invoke (или другой механизм синхронизации), чтобы сделать это в потоке пользовательского интерфейса. Другой вариант - использовать специализированную коллекцию, которая заботится о сортировке события до правильной темы. См. this article для примера такой коллекции.

+0

I am Использование Josh Einstein's (http://stackoverflow.com/questions/2091988/how-do-i-update-an-observablecollection-via-a-worker-thread) AddOnUI для обновления коллекций. Но меня главным образом интересует свойство объекта в MVVM, которое, в свою очередь, передает другие свойства ViewModel. – Bhuvan

1

В моем опыте работы с Silverlight, пытаясь сделать это вызовет исключение в любом случае.

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

Для того, чтобы позволить ViewModel, чтобы сделать это, не зная о реальной Dispatcher, я нашел, что это полезно для создания интерфейса IDispatcher, а затем использовать SameThreadDispatcher для испытаний и SystemDispatcher (который делегирует реальные вещи) для производство. Затем вы передаете ViewModel значение IDispatcher в качестве зависимости.

+0

Я не знаю о Silverlight, но в WPF вы * можете * обновлять свойства ViewModel из рабочего потока без проблем, но коллекции должны быть изменены в потоке пользовательского интерфейса ... (см. Мой ответ для деталей) –