2012-04-11 3 views
2

Auszug aus Code aus meiner Modellansicht.Dispatcher-Update einer CollectionViewSource.Source löst falsche Thread-Ausnahme während desselben Threads aus

private ObservableCollection<MessageAbstract> _messages; 

    /// <summary> 
    /// Gets the Messages property. 
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary> 
    public ObservableCollection<MessageAbstract> Messages 
    { 
     get 
     { 
      return _messages; 
     } 

     set 
     { 
      if (_messages == value) 
      { 
       return; 
      } 

      _messages = value; 
      RaisePropertyChanged(() => Messages); 
     } 
    } 

    private CollectionViewSource _messageView; 

    public CollectionViewSource MessageView 
    { 
     get { return _messageView; } 
     set 
     { 
      if (_messageView == value) return; 
      _messageView = value; 
      RaisePropertyChanged(() => MessageView); 
     } 
    } 

private void MessageArrived(Message message){ 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Send, 
     new Action(() =>Messages.Add(message)); 
} 

public ModelView(){ 
    MessageView = new CollectionViewSource{Source = Messages}; 
} 

Wenn mein Rückruf von einem anderen Dienst aufgerufen wird, ich bin immer noch ein diese Ausnahme auf der Messages.Add (Meldung) Die Ausnahmemeldung bekommen ist wie folgt. "Diese Art von CollectionView unterstützt keine Änderungen an der SourceCollection von einem Thread, der sich vom Dispatcher-Thread unterscheidet."

Auszug Code aus meiner Sicht.

<ListBox x:Name="MessageList" ItemsSource="{Binding MessagesView}"> 

Ich habe überprüft, dass die Application.Current.Dispatcher das gleiche wie die MessageList.Dispatcher ist so jetzt über ich bin verloren, warum ich meine Ansicht nicht hinzufügen können. Mein Hauptziel ist, dass ich ein Suchfeld habe, das den Quellenfilter der Sammlungsansicht verwendet, um die Nachrichtenliste zu filtern.

bekam die Antwort

ich meine Antwort die Fehler der gleiche wie der # 2-Punkt in der Antwort unten war gefunden. Ich habe gerade die Erstellung meiner Sammlungen im App-Dispatcher gekapselt.

Application.Current.Dispatcher.Invoke(DispatcherPriority.Send,new Action(
    () => { Messages = new ObservableCollection<MessageAbstract>(); 
       MessageView = new CollectionViewSource { Source = Messages }; 
            )); 

WPF: Accessing bound ObservableCollection fails althouth Dispatcher.BeginInvoke is used

Wir haben in dieses Problem vor uns laufen. Das Problem ist zweifach:

1- Stellen Sie sicher, dass alle Änderungen an der SourceCollection auf dem Hauptthread sind (Sie haben> das getan).

2- Stellen Sie sicher, dass die Erstellung der CollectionView auch im Hauptthread war (wenn sie in einem anderen Thread erstellt wurde, z. B. als Antwort auf einen Event-Handler, ist dies normalerweise nicht der Fall). Die CollectionView erwartet Änderungen an "seinem" Thread, UND dass "sein"> Thread der "UI" -Thread ist.

+0

Dies funktioniert in einem Beispielprojekt, alles, was ich getan habe, war die Aufrufe RaisePropertyChanged() kommentieren. Wenn Sie jedoch den Wrapper "Application.Current.Dispatcher.Invoke()" entfernen, führt dies zu der von Ihnen angegebenen Ausnahme. Daher liegt der Fehler an anderer Stelle, nicht im Dispatcher-Hopping-Code. – Alan

Antwort

1

Ich hatte die gleichen Thread-Probleme beim Binden direkt an eine CollectionViewSource. Ich habe das Problem behoben, indem ich meine Listbox an ein CollectionView Objekt gebunden habe.

In Ihrem Fall würden Sie müssen einfach Ihre listbox Erklärung ändern:

<ListBox x:Name="MessageList" ItemsSource="{Binding MessagesView.View}"> 

Hoffnung, dies hilft Ihnen.

Verwandte Themen