2010-12-11 14 views
5

Pouvons-nous mettre à jour le contexte de données d'un contrôle WPF dans un thread non-UI?Threading WPF: puis-je mettre à jour le contexte de données d'un contrôle dans un thread non-UI?

Disons que nous avons un Label qui a MyClass comme contexte de données, et de se lier Content à MyProperty:

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

MyClass est tout simplement:

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

Dans un thread non-UI , nous pouvons faire myClass.MyProperty = "updated" pour mettre à jour le contenu de l'étiquette, mais nous ne pouvons pas faire label.Content = "updated" directement. Est-ce exact?

Ma réponse:

Voici ce que j'ai trouvé:

Répondre

2

Eh oui, cela est exact. Il existe également des mises en garde supplémentaires sur les collections (l'événement CollectionChanged doit être exécuté dans le thread UI).

Habituellement, vous utilisez ObservableCollection<T> pour lier à une collection. Si vous mettez à jour cette collection à partir d'un thread non-interface utilisateur, le code sera interrompu, car les événements sont déclenchés à partir du même thread sur lequel ils sont exécutés (ObservableCollection<T> déclenche un événement lorsque des modifications dans la collection se produisent). Pour contourner cela, vous devez fournir un délégué à une implémentation personnalisée de ObservableCollection<T> qui déclenche l'événement dans le thread d'interface utilisateur (à l'aide de Dispatcher).

+0

Pourriez-vous me plus d'informations sur les collections? Merci. – Shuo

+0

Merci, je pense que j'ai une solution ici: http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx – Shuo

+0

J'ai utilisé celui-là aussi, mais il y a des cas où le code ne fonctionne pas (certains objets wpf n'héritent pas de DispatcherObject). – Femaref