Heim >Backend-Entwicklung >C++ >Wie ändere ich eine ObservableCollection aus einem Nicht-Dispatcher-Thread in WPF?

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 20:06:01943Durchsuche

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

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

Problembeschreibung

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.

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

Aktualisierter ViewModel-Code

<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.

Verbesserte Bindung und Aktualisierung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn