Il y a deux problèmes avec la réponse de l'utilisateur2134678. L'un est très mineur et n'a aucun effet fonctionnel. L'autre est assez important.
Le premier problème est que le GotFocus est en fait appelé contre le DataGrid, et non le DataGridCell dans la pratique. Le qualificatif DataGridCell dans le XAML est redondant.
Le principal problème que j'ai trouvé avec la réponse est que le comportement de la touche Entrée est cassé. La touche Entrée devrait vous faire passer à la cellule suivante sous la cellule actuelle dans le comportement normal d'un DataGrid. Cependant, ce qui se passe en coulisses, c'est que l'événement GotFocus est appelé deux fois. Une fois lorsque la cellule actuelle perd le focus, et une fois lorsque la nouvelle cellule gagne le focus. Mais tant que BeginEdit est appelé sur cette première cellule, la cellule suivante ne sera jamais activée. Le résultat est que vous avez une édition en un clic, mais toute personne qui ne clique pas littéralement sur la grille va être gênée, et un concepteur d'interface utilisateur ne devrait pas supposer que tous les utilisateurs utilisent des souris. (Les utilisateurs de claviers peuvent en quelque sorte contourner le problème en utilisant la touche Tab, mais cela signifie tout de même qu'ils doivent passer par des étapes qu'ils ne devraient pas avoir à franchir).
La solution à ce problème ? Gérer l'événement KeyDown pour la cellule et, si la touche est la touche Entrée, définir un indicateur qui empêche BeginEdit de se déclencher sur la première cellule. Maintenant, la touche Entrée se comporte comme elle le devrait.
Pour commencer, ajoutez le style suivant à votre DataGrid :
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}" x:Key="SingleClickEditingCellStyle">
<EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
</Style>
</DataGrid.Resources>
Appliquez ce style à la propriété "CellStyle" des colonnes pour lesquelles vous voulez activer le one-click.
Ensuite, dans le code qui suit, vous avez ce qui suit dans votre gestionnaire GotFocus (notez que j'utilise VB ici parce que c'est ce que notre client "demande de grille de données en un clic" voulait comme langage de développement) :
Private _endEditing As Boolean = False
Private Sub DataGrid_GotFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
If Me._endEditing Then
Me._endEditing = False
Return
End If
Dim cell = TryCast(e.OriginalSource, DataGridCell)
If cell Is Nothing Then
Return
End If
If cell.IsReadOnly Then
Return
End If
DirectCast(sender, DataGrid).BeginEdit(e)
.
.
.
Ensuite, vous ajoutez votre gestionnaire de l'événement KeyDown :
Private Sub DataGridCell_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
If e.Key = Key.Enter Then
Me._endEditing = True
End If
End Sub
Vous disposez maintenant d'un DataGrid qui n'a pas modifié le comportement fondamental de l'implémentation prête à l'emploi, mais qui prend en charge l'édition en un seul clic.
0 votes
Utilisez-vous le DataGrid qui se trouve dans le WPF Toolkit ?
4 votes
Serait-il possible pour vous de nous donner un peu plus d'informations sur ce que vous avez essayé et sur ce qui ne fonctionne pas ?