Maison  >  Article  >  développement back-end  >  Comment modifier une ObservableCollection à partir d’un thread non-dispatcher dans WPF ?

Comment modifier une ObservableCollection à partir d’un thread non-dispatcher dans WPF ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 20:06:01871parcourir

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

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

Description du problème

Une liaison DataGrid à une ObservableCollection remplie de manière asynchrone génère une erreur indiquant que les modifications apportées à SourceCollection ne sont pas autorisées à partir d'un thread non-Dispatcher.

Solution

Le problème vient de l'affinité du thread. L'ObservableCollection est initialement créée sur le thread d'interface utilisateur, ce qui la rend accessible uniquement à partir du thread d'interface utilisateur. Pour le modifier à partir d'un fil de discussion différent, le délégué doit être placé sur le répartiteur d'interface utilisateur.

Code ViewModel mis à jour

<code class="csharp">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);
        });
    }
}</code>

En appelant le délégué sur le répartiteur d'interface utilisateur, les ajouts à ObservableCollection sont planifiés sur le thread de l'interface utilisateur, résolvant l'exception.

Liaison et actualisation améliorées

Pour la liaison asynchrone et l'actualisation du DataGrid, envisagez d'utiliser INotifyPropertyChanged sur vos propriétés ViewModel et d'appeler le Dispatcher pour actualiser le Éléments de l'interface utilisateur.

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