2010-12-11 15 views
5

¿Podemos actualizar el contexto de datos de un control WPF en un hilo que no sea UI?Enhebrado WPF: ¿puedo actualizar el contexto de datos de un control en un hilo que no sea UI?

Digamos que tenemos un Label que tiene MyClass como contexto de datos, y se unen Content a MyProperty:

<Label Name="label" Content="{Binding MyProperty}" />,

donde MyClass es simplemente:

public class MyClass : INotifyPropertyChanged 
{ 
    int _myField; 
    public int MyProperty 
    { 
     get 
     { 
      return _myField; 
     } 
     set 
     { 
      _myField = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("MyProperty")); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

En un subproceso no UI , podemos hacer myClass.MyProperty = "updated" para actualizar el contenido de la etiqueta, pero no podemos hacer label.Content = "updated" directamente. ¿Es eso correcto?

Mi propia respuesta:

Esto es lo que he encontrado:

Respuesta

2

Sí, eso es correcto. También hay advertencias adicionales con colecciones (el evento CollectionChanged debe ejecutarse en el hilo de la interfaz de usuario).

Normalmente, está utilizando ObservableCollection<T> para enlazar a una colección. Si actualiza esta colección desde un hilo que no sea UI, el código se romperá, ya que los eventos se disparan desde el mismo hilo en el que se ejecutan (ObservableCollection<T> activa un evento cuando ocurren cambios en la colección). Para evitar esto, debe proporcionar un delegado a una implementación personalizada de ObservableCollection<T> que desencadena el evento en el subproceso de la interfaz de usuario (usando Dispatcher).

+0

¿Podría darme más detalles sobre las colecciones? Gracias. – Shuo

+0

Gracias, creo que tengo una solución aquí: http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx – Shuo

+0

Utilicé ese también, pero hay casos en los que el código no funciona (algunos objetos wpf no heredan de DispatcherObject). – Femaref

Cuestiones relacionadas