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

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
Linda HamiltonOriginal
2024-10-31 09:39:01445Durchsuche

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);
        });
    }
}

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);
            }
        });
    });
}

DataGrid-Bindung und -Aktualisierung:

Bindung:

<DataGrid ItemsSource="{Binding MatchObsCollection}"/>

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;
        });
    });
}

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!

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