Maison > développement back-end > C++ > le corps du texte

Comment résoudre « Ce type de CollectionView ne prend pas en charge les modifications apportées à sa SourceCollection à partir d'un thread différent du thread Dispatcher » ?

Linda Hamilton
Libérer: 2024-10-31 09:39:01
original
460 Les gens l'ont consulté

How to Resolve

Erreur : "Ce type de CollectionView ne prend pas en charge les modifications apportées à sa SourceCollection à partir d'un thread différent du thread Dispatcher"

Problème :

L'erreur se produit lors de la modification d'une ObservableCollection sur un thread autre que le thread de l'interface utilisateur.

Solution :

1. Utilisation de Dispatcher.Invoke :

Pour mettre à jour ObservableCollection à partir d'un autre thread, invoquez les modifications sur le thread de l'interface utilisateur à l'aide de 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);
        });
    }
}
Copier après la connexion

2. Utilisation de async/await :

Vous pouvez également utiliser async/await pour exécuter la méthode Load de manière asynchrone sur le thread de l'interface utilisateur.

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);
            }
        });
    });
}
Copier après la connexion

Liaison et actualisation de DataGrid :

Liaison :

<DataGrid ItemsSource="{Binding MatchObsCollection}"/>
Copier après la connexion

Actualisation asynchrone :

Pour actualiser le DataGrid de manière asynchrone, appelez l'option Actualiser méthode sur le répartiteur dans un délégué.

public void RefreshDataGridAsync()
{
    Task.Run(() =>
    {
        Dispatcher.InvokeAsync(() =>
        {
            dataGridParent.ItemsSource = null;
            dataGridParent.ItemsSource = MatchObsCollection;
        });
    });
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!