2010-09-30 10 views
6

¿Existe algún problema potencial con la actualización de las propiedades de la interfaz de usuario del ViewModel del Backgroundworker? Estoy tratando de actualizar la máquina virtual mientras está vinculada a la interfaz de usuario, y potencialmente los usuarios pueden estar escribiendo ... ¿cómo funciona la sincronización aquí (no creo que pueda usar las declaraciones de bloqueo de XAML).WPF MVVM Actualización de propiedades de la interfaz de usuario de BackgroundWorker

Gracias de antemano ..

Respuesta

3

Al actualizar las propiedades escalares, no necesita preocuparse por hacerlo en el hilo de la interfaz de usuario. El evento PropertyChanged se organiza automáticamente en la secuencia de la interfaz de usuario.

Sin embargo, no funcionará para colecciones que implementen INotifyCollectionChanged. El evento CollectionChanged no se organizará en el subproceso de la interfaz de usuario, y causará una excepción. Por lo tanto, si modifica una colección que está vinculada a un ItemsControl, necesita usar Dispatcher.Invoke (u otro mecanismo de sincronización) para hacerlo en el subproceso de la interfaz de usuario. Otra opción es utilizar una colección especializada que se encarga de coordinar el evento con el hilo correcto. Ver this article para un ejemplo de tal colección.

+0

I Estoy usando Josh Einstein (http://stackoverflow.com/questions/2091988/how-do-i-update-an-observablecollection-via-a-worker-thread) AddOnUI para actualizar colecciones. Pero me preocupa principalmente la propiedad del objeto en el MVVM que a su vez alimenta otras propiedades del ViewModel. – Bhuvan

1

En mi experiencia con Silverlight, tratando de hacerlo causará una excepción de todos modos.

Básicamente debe actualizar las propiedades enlazadas desde la cadena de distribución, como si estuviera modificando la interfaz de usuario directamente.

Con el fin de permitir que el modelo de vista para hacer eso sin necesidad de conocer un verdadero Dispatcher, he encontrado que es útil para crear una interfaz IDispatcher, a continuación, utilizar un SameThreadDispatcher para las pruebas y una SystemDispatcher (que los delegados a la cosa real) para producción. A continuación, pasa el modelo de vista IDispatcher como una dependencia.

+0

No sé de Silverlight, pero en WPF * puede * actualizar las propiedades de ViewModel de un hilo de trabajo sin problemas, pero las colecciones deben modificarse en el hilo de la interfaz de usuario ... (ver mi respuesta para más detalles) –

Cuestiones relacionadas