Maison  >  Article  >  développement back-end  >  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 » ?

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

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

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

Liaison et actualisation de DataGrid :

Liaison :

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

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

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!

Déclaration:
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