Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan \'Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada thread Dispatcher\'?

Bagaimana untuk Menyelesaikan \'Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada thread Dispatcher\'?

Linda Hamilton
Linda Hamiltonasal
2024-10-31 09:39:01565semak imbas

How to Resolve

Ralat: "Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada Dispatcher thread"

Masalah:

Ralat berlaku apabila mengubah suai ObservableCollection pada urutan selain daripada urutan UI.

Penyelesaian:

1. Menggunakan Dispatcher.Invoke:

Untuk mengemas kini ObservableCollection daripada urutan lain, gunakan perubahan pada urutan UI menggunakan Dispatcher.Invoke.

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. Menggunakan async/wait:

Sebagai alternatif, anda boleh menggunakan async/waiit untuk melaksanakan kaedah Muatkan secara tidak segerak pada urutan UI.

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 Binding and Refreshing:

Mengikat:

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

Menyegarkan Secara Asynchronous:

Untuk memuat semula DataGrid secara tidak segerak, panggil Muat Semula kaedah pada penghantar dalam perwakilan.

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

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan \'Jenis CollectionView ini tidak menyokong perubahan pada SourceCollection daripada thread yang berbeza daripada thread Dispatcher\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn