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 » ?
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!