Heim > Artikel > Backend-Entwicklung > Warum erhalte ich die Meldung „Dieser CollectionView-Typ unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread“?
Die angegebene Fehlermeldung „Dieser Typ of CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem Thread, der sich vom Dispatcher-Thread unterscheidet,“ weist auf einen Versuch hin, eine ObservableCollection von einem Nicht-UI-Thread zu ändern.
Wie im bereitgestellten Code erläutert, ist Load( des ViewModel) )-Methode füllt die _matchObsCollection ObservableCollection aus einer Liste von GetMatchDetailsDC-Objekten. Dieses Update wird jedoch außerhalb des UI-Threads durchgeführt.
In WPF werden die UI-Elemente, wie z. B. das DataGrid, im UI-Thread erstellt und verwalten einen Thread-Affinität. Alle Änderungen an diesen Elementen müssen vom UI-Thread aus durchgeführt werden, um die Thread-Sicherheit zu gewährleisten.
Um dieses Problem zu beheben, können Sie App.Current.Dispatcher.Invoke(( Action)delegate { ... })-Methode zum Aufrufen der Sammlungsaktualisierung im UI-Thread:
<code class="csharp">matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate // <-- Here { _matchObsCollection.Add(match); }); }</code>
Während die Verwendung asynchroner Methoden zum Laden von Daten üblich ist, Bei der Bearbeitung von UI-Elementen aus Nicht-UI-Threads ist es wichtig, die Thread-Sicherheit zu berücksichtigen. Stellen Sie immer sicher, dass alle Aktualisierungen von UI-Elementen, wie z. B. das Ändern einer ObservableCollection, im UI-Thread durchgeführt werden, um Thread-bezogene Fehler zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Meldung „Dieser CollectionView-Typ unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!