Lors de la mise à jour d'une ObservableCollection liée à un DataGrid à partir d'un thread autre que le thread d'interface utilisateur, un Une exception peut se produire : "Ce type de CollectionView ne prend pas en charge les modifications apportées à sa SourceCollection à partir d'un thread différent du thread Dispatcher."
Les collections observables sont créées sur le thread de l'interface utilisateur. En conséquence, ils ont une affinité pour ce fil, ce qui signifie que les modifications ne peuvent être apportées qu’à partir du même fil. Tenter de les modifier à partir d'un autre thread (par exemple, un thread d'arrière-plan) déclenchera l'exception.
Pour résoudre le problème, appelez le répartiteur d'interface utilisateur lors de la mise à jour de l'ObservableCollection à partir de un fil différent. Cela déléguera l'opération au thread de l'interface utilisateur, où elle pourra être exécutée en toute sécurité.
public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { // This syntax invokes the UI dispatcher // and modifies the ObservableCollection on the UI thread App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }
Pour lier un DataGrid de manière asynchrone et actualisez-le si nécessaire :
// Bind DataGrid to ObservableCollection DataGrid.SetBinding(ItemsSourceProperty, new Binding("MatchObsCollection")); // Subscribe to CollectionChanged event MatchObsCollection.CollectionChanged += (s, e) => { DataGrid.Items.Refresh(); };
En suivant ces directives, vous pouvez mettre à jour en toute sécurité les ObservableCollections et lier les DataGrids de manière asynchrone tout en vous assurant que les modifications sont apportées sur le bon fil.
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!