WPF MVVM Обновление свойств привязки пользовательского интерфейса из BackgroundWorker - PullRequest
6 голосов
/ 01 октября 2010

Существуют ли потенциальные проблемы с обновлением привязанных к интерфейсу свойств ViewModel из Backgroundworker? Я пытаюсь обновить виртуальную машину, пока она связана с пользовательским интерфейсом, и, возможно, пользователи могут вводить данные ... как здесь работает синхронизация (я не думаю, что могу использовать операторы Lock из XAML).

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

Ответы [ 2 ]

3 голосов
/ 01 октября 2010

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

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

1 голос
/ 01 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...