„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie ändere ich eine ObservableCollection aus einem Nicht-Dispatcher-Thread in WPF?

Wie ändere ich eine ObservableCollection aus einem Nicht-Dispatcher-Thread in WPF?

Veröffentlicht am 08.11.2024
Durchsuche:461

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

"Diese Art von CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread"

Problembeschreibung

Ein DataGrid gebunden zu einer asynchron gefüllten ObservableCollection löst einen Fehler aus, der besagt, dass Änderungen an der SourceCollection von einem Nicht-Dispatcher nicht zulässig sind Thread.

Lösung

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 auf dem UI-Dispatcher platziert werden.

Aktualisierter ViewModel-Code

public void Load()
{
    matchList = new List();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Durch Aufrufen des Delegaten auf dem UI-Dispatcher werden die Ergänzungen zur ObservableCollection im UI-Thread geplant, wodurch die Ausnahme aufgelöst wird.

Erweiterte Bindung und Aktualisierung

Für asynchron Um das DataGrid zu binden und zu aktualisieren, sollten Sie INotifyPropertyChanged für Ihre ViewModel-Eigenschaften verwenden und den Dispatcher aufrufen, um das DataGrid zu aktualisieren UI-Elemente.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3