WPF MVVM обновляет модель представления в фоновом режиме - PullRequest
7 голосов
/ 04 марта 2011

Действителен ли этот senerio?

У меня есть вид для поддержания предмета.

У меня есть View Model, которая выставляет Объект Item (реализует INotifyPropertyChanged) как Свойство, к которому привязан View.

Допустимо ли передавать объект Item фоновому работнику, в котором он был изменен, а затем вызывать событие PropertyChanged после завершения BackgroundWorking?

Или BackgroundWorker никоим образом не должен изменять объект Item. Я бы обновил существующий объект Item с результатами, переданными BackgroundWorker. Это будет сделано в событии RunWorkerCompleted. Но блокирует ли это поток пользовательского интерфейса и уничтожает объект, имеющий рабочий фон?

Confused

Я постараюсь объяснить.

Пользователь использует опцию для создания Предмета. Я создаю модель просмотра и просмотра. В модели View создается пустой объект Item. Ему предоставляется вид для поддержания предмета. При выборе свойства «Тип элемента» это инициирует сложный процесс для создания списка свойств, которые будут введены пользователем. Я мог бы заблокировать поток пользовательского интерфейса во время создания списка, но это дает плохой пользовательский опыт. Я хочу передать обработку в фоновый поток, сохраняя при этом пользовательский интерфейс. В настоящее время я установил флаг, указывающий, что раздел в представлении загружается, передал объект Item в BackgroundWorker, который обновляет наблюдаемую коллекцию Properties. Когда BackgroundWorking завершится, я вызываю событие PropertyChanged, которое обновляет раздел представления, связанный со списком, и отключает флаг, чтобы указать, что раздел загружается. Кажется, это работает без проблем. Но у меня есть ощущение, что я не должен обновлять связанные объекты из модели представления в фоновом потоке.

Спасибо, Тим

1 Ответ

8 голосов
/ 04 марта 2011

Звучит нормально. Пока ваш предмет-объект нет DependencyObject, вы можете изменять их свойства в фоновом режиме.
Будет работать привязка данных к свойствам вашего объекта, механизм привязки автоматически выполнит переключение потоков.
Однако не заполняйте связанные с данными коллекции и не манипулируйте свойствами объектов DependencyObject (например, UI-Controls) в фоновом режиме, не отправляя манипуляции. Это приведет к исключению.

Edit:
Только для пояснения: реальный вопрос не в том, является ли объект-объект DependencyObject, а в том, является ли свойство CLR-property или DependencyProperty. Поскольку свойства DependencyProperties связаны с объектами DependencyObjects, я часто использую приведенное выше упрощение, но это не полная правда.
Это означает, что если у вас есть CLR-свойство, вы можете установить его значение из стороннего потока, независимо от того, является ваш класс DepenendencyObject или нет. Это небольшое отличие от моего первого утверждения.

...