ホームページ >バックエンド開発 >C++ >「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」を解決する方法は?

「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」を解決する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 09:39:01529ブラウズ

How to Resolve

エラー: 「このタイプの CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。」

問題:

UI スレッド以外のスレッドで ObservableCollection を変更するとエラーが発生します。

解決策:

1. Dispatcher.Invoke の使用:

別のスレッドから ObservableCollection を更新するには、Dispatcher.Invoke を使用して UI スレッドで変更を呼び出します。

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. async/await の使用:

または、async/await を使用して、UI スレッドで Load メソッドを非同期に実行できます。

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 バインディングとリフレッシュ:

バインディング:

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

非同期更新:

DataGrid を非同期的に更新するには、Refresh メソッドを呼び出します。デリゲート内のディスパッチャーのメソッド。

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

以上が「この種類の CollectionView は、ディスパッチャー スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません」を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。