WPF DataGrid SelectedItem
J'ai un DataGrid un utilisateur peut ajouter des éléments à la en entrant des données dans la dernière ligne. J'ai aussi un bouton qui supprime l'élément actuellement sélectionné. Mais lorsque la dernière (vide, pour ajouter de nouveaux éléments) ligne est sélectionnée, ce qui a été le dernier élément sélectionné reste en SelectedItem. Donc, si j'ouvre la fenêtre, sélectionnez la dernière ligne et appuyez sur le bouton supprimer, il va supprimer la première ligne, comme il est sélectionné par défaut, et en sélectionnant la dernière ligne n'a pas changé SelectedItem. Toute bonne façon de traiter ce problème?
À préciser:
SelectedItem="{Binding X}"
X dans le ViewModel ne change pas lorsque la dernière ligne est sélectionnée (le setter n'est pas invoquée à tous). Je ne suis pas sûr de savoir si la propriété SelectedItem lui-même des changements, mais je suppose qu'il ne l'est pas.
Il y a aussi une exception lorsque je sélectionne la dernière ligne (bordure rouge), mais quand je clique à nouveau pour commencer la saisie des données, la bordure rouge disappers. Vous ne savez pas si ces deux sont liés.
OriginalL'auteur svinja | 2012-02-02
Vous devez vous connecter pour publier un commentaire.
Exécuter l'exemple suivant et vous verrez pourquoi il ne fonctionne pas.
XAML:
Code-behind:
Comme vous pouvez le voir lors de l'exécution, la sélection de la "nouvelle" ligne provoque une sentinelle de la valeur à régler l'élément sélectionné dans la
DataGrid
. Cependant, WPF est pas en mesure de convertir cette sentinelle élément à unPerson
, de sorte que leSelectedItem
de liaison ne parvient pas à convertir.Pour résoudre ce problème, vous pouvez mettre un convertisseur sur votre liaison qui détecte la sentinelle et retourne
null
lors d'une détection. Voici un convertisseur qui permet de faire:Comme vous pouvez le voir, c'est une triste nécessité de tester contre la
ToString()
valeur de la sentinelle, parce que c'est un type interne. Vous pouvez également (ou en plus) vérifier queGetType().Name
estNamedObject
.OriginalL'auteur Kent Boogaart
Difficile à dire sans le code, mais je regarde le suivant.
De s'assurer que chaque fois qu'un élément est supprimé et il est également l'élément sélectionné, réglez l'élément sélectionné lié à la propriété dans votre ViewModel à null. Vous aurez besoin pour vous assurer que votre SelectedItem lié à la propriété n'est pas lié oneway.
OriginalL'auteur ChrisBD
Il semble que vous avez oublié de définir le Mode de liaison et la valeur par défaut est Unidirectionnelle. Ce qui signifie que les modifications apportées à votre avis, ne pas propager de retour à votre modèle de vue.
Et assurez-vous toujours que vous avez le droit datacontext.
Espère que ça aide.
OriginalL'auteur T.Ho