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
Lepaskan: 2024-10-31 09:39:01
asal
530 orang telah melayarinya

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);
        });
    }
}
Salin selepas log masuk

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);
            }
        });
    });
}
Salin selepas log masuk

DataGrid Binding and Refreshing:

Mengikat:

<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
Salin selepas log masuk

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;
        });
    });
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan