Comment Prévenir WPF DataGrid à Partir de la Sélection de SelectedItem Lorsque les Éléments mis à Jour?
Mon scénario: j'ai un thread d'arrière-plan qui interroge les changements et les met à jour périodiquement un WPF de DataGrid ObservableCollection MVVM (de style). L'utilisateur peut cliquer sur une ligne dans la grille de données et de rapprocher les "détails" de la ligne à côté d'un UserControl sur le même écran principal.
Lorsque le thread d'arrière-plan a des mises à jour, il parcourt les objets dans l'ObservableCollection et remplace les objets individuels, s'ils ont changé (en d'autres termes, je ne suis pas de reliaison une toute nouvelle ObservableCollection pour le contrôle DataGrid, mais au lieu de remplacer les éléments de la collection, ce qui permet le contrôle DataGrid à maintenir l'ordre de tri lors des mises à jour).
Le problème est qu'après que l'utilisateur a sélectionné une ligne spécifique et les détails sont affichés dans les zones adjacentes UserControl, lorsque le thread d'arrière-plan des mises à jour de la grille de la grille de données perd la SelectedItem (il retombe à l'indice de -1).
Comment puis-je conserver le SelectedItem entre les mises à jour à l'ObservableCollection?
OriginalL'auteur Chris Holmes | 2010-09-02
Vous devez vous connecter pour publier un commentaire.
Si votre grille est unique sélection, ma suggestion est que vous utilisez la CollectionView que l'ItemsSource à la place de l'ObservableCollection. Ensuite, assurez-vous que la grille de données.IsSynchronizedWithCurrentItem est définie sur true. Enfin, à la fin de votre "remplacer l'élément logique", il suffit de déplacer le CollectionView de CurrentItem à la correspondante d'un nouvel élément.
Ci-dessous est un exemple qui illustre cela. (Je suis en utilisant une zone de liste ici. Espérons que cela fonctionne bien avec votre grille de données).
EDITION - NOUVEAU ÉCHANTILLON EN UTILISANT MVVM:
XAML
Code-Behind:
ANCIEN ÉCHANTILLON:
XAML:
Code-behind:
Je ne suggère pas que vous avez tout gérer en un clic sur un bouton gestionnaire. C'était juste un exemple de code. L'idée est que vous faites quelque chose dans votre ViewModel qui est similaire à celle de l'événement Button_Click dans mon exemple. Laissez-moi essayer de vous écrire un MVVM exemple. Je vais revenir à vous.
Voir Modifier. J'espère que cela vous donne une meilleure idée. Il contient une zone de liste dont les données sont en cours de façon aléatoire mis à jour toutes les 5 secondes. Vous verrez qu'il conserve encore la sélection après les mises à jour.
OriginalL'auteur ASanch
Je n'ai pas travaillé avec WPF DataGrid, mais je voudrais essayer cette approche:
Ajouter une propriété à la vue-modèle qui contiendra la valeur de l'élément actuellement sélectionné.
Lier
SelectedItem
à cette nouvelle propriété à l'aide deTwoWay
.De cette façon, lorsque l'utilisateur sélectionne une ligne, il mettra à jour la vue-modèle, et lorsque le
ObservableCollection
est mis à jour, cela n'affectera pas la propriété à laquelleSelectedItem
est lié. Être lié, je ne m'attends pas qu'il pourrait réinitialiser dans la façon dont vous voyez.Est l'élément sélectionné lui-même être mis à jour, ou tout simplement d'autres éléments?
Tous les articles sont en cours de mise à jour.
OriginalL'auteur Jay
Vous pourriez, dans la logique que les mises à jour de la Collecte, de l'enregistrer au large de la CollectionView.Actuelle de l'élément de référence à une autre variable. Puis, après vous avez terminé la mise à jour, appelez CollectionView.MoveCurrentTo(variable) pour réinitialiser l'élément sélectionné.
OriginalL'auteur GWLlosa