Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann das Problem behoben werden: „Dieser CollectionView-Typ unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread'?

Linda Hamilton
Freigeben: 2024-10-31 09:39:01
Original
460 Leute haben es durchsucht

How to Resolve

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

Problem:

Der Fehler tritt auf, wenn eine ObservableCollection in einem anderen Thread als dem UI-Thread geändert wird.

Lösung:

1. Verwenden von Dispatcher.Invoke:

Um die ObservableCollection aus einem anderen Thread zu aktualisieren, rufen Sie die Änderungen im UI-Thread mit Dispatcher.Invoke auf.

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);
        });
    }
}
Nach dem Login kopieren

2. Verwenden von async/await:

Alternativ können Sie async/await verwenden, um die Load-Methode asynchron im UI-Thread auszuführen.

public void LoadAsync()
{
    Task.Run(async () =>
    {
        matchList = new List<GetMatchDetailsDC>();
        matchList = await proxy.GetMatchAsync();

        await Dispatcher.InvokeAsync(() =>
        {
            foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
            {
                _matchObsCollection.Add(match);
            }
        });
    });
}
Nach dem Login kopieren

DataGrid-Bindung und -Aktualisierung:

Bindung:

<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
Nach dem Login kopieren

Asynchrones Aktualisieren:

Um das DataGrid asynchron zu aktualisieren, rufen Sie „Refresh“ auf Methode für den Dispatcher in einem Delegaten.

public void RefreshDataGridAsync()
{
    Task.Run(() =>
    {
        Dispatcher.InvokeAsync(() =>
        {
            dataGridParent.ItemsSource = null;
            dataGridParent.ItemsSource = MatchObsCollection;
        });
    });
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann das Problem behoben werden: „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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!