Heim >Backend-Entwicklung >C++ >Wie ändere ich eine ObservableCollection aus einem Nicht-Dispatcher-Thread in WPF?
Eine DataGrid-Bindung zu einer asynchron gefüllten ObservableCollection löst einen Fehler aus, der besagt, dass Änderungen an der SourceCollection von einem Nicht-Dispatcher-Thread aus nicht zulässig sind.
Das Problem ergibt sich aus der Thread-Affinität. Die ObservableCollection wird zunächst im UI-Thread erstellt, sodass nur über den UI-Thread darauf zugegriffen werden kann. Um es von einem anderen Thread aus zu ändern, muss der Delegat im UI-Dispatcher platziert werden.
<code class="csharp">public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }</code>
Durch den Aufruf des Delegaten im UI-Dispatcher werden die Ergänzungen zur ObservableCollection vorgenommen werden im UI-Thread geplant, wodurch die Ausnahme behoben wird.
Für die asynchrone Bindung und Aktualisierung des DataGrids sollten Sie erwägen, INotifyPropertyChanged für Ihre ViewModel-Eigenschaften zu verwenden und den Dispatcher aufzurufen, um das zu aktualisieren UI-Elemente.
Das obige ist der detaillierte Inhalt vonWie ändere ich eine ObservableCollection aus einem Nicht-Dispatcher-Thread in WPF?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!