WPF DataGridTemplateColumn. Ai-je raté quelque chose?
<data:DataGridTemplateColumn Header="Name">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}">
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Name}">
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
Il est clair exemple de Modèle de colonne, à droite? Ce qui pourrait être mal avec ça?
Donc, voici la chose - quand un utilisateur navigue à travers DataGrid avec frapper touche TAB, il a besoin de frapper l'ONGLET deux fois(!) pour être en mesure de modifier le texte dans la zone de texte. Comment pourrais-je le rendre modifiable dès que l'utilisateur obtient la colonne de mise au point, je veux dire même si il commence juste à taper?
Ok. J'ai trouvé un moyen en Grille.KeyUp (), j'ai mis le code ci-dessous:
if (Grid.CurrentColumn.Header.ToString() == "UserName")
{
if (e.Key != Key.Escape)
{
Grid.BeginEdit();
//Simply send another TAB press
if (Keyboard.FocusedElement is Microsoft.Windows.Controls.DataGridCell)
{
var keyEvt = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent };
InputManager.Current.ProcessInput(keyEvt);
}
}
}
Vous devez vous connecter pour publier un commentaire.
votre problème provient du fait que chaque cellule met son éditeur dans un contrôle de contenu qui reçoit le focus, puis vous avez à onglet une fois de plus à l'éditeur. Si vous regardez le code pour DataGridTemplateColumn dans le GenerateEditingElement méthode qu'il appelle une méthode LoadTemplateContent qui fait ceci:
voir comment il crée un nouveau contenu présentateur de mettre le modèle dans. D'autres personnes ont abordé ce problème dans une variété de façons, je retire mon propre type de colonne pour faire face à ce genre de choses. (donc, je n'ai pas de créer un élément supplémentaire, ou de définir le contenu présentateur de ne pas recevoir le focus) Dans ce exemple ils sont à l'aide de gestionnaire de focus pour traiter le même problème (je n'ai pas testé ce code)
Si vous avez un contrôle utilisateur comme votre éditeur de texte vous pouvez utiliser le modèle avec le gestionnaire de focus ou de l'utilisation d'un gestionnaire d'événement pour la OnLoaded événement.
Le problème que vous avez rencontré est que le contrôle (par exemple, zone de texte) à l'intérieur de la DataGridTemplateColumn est contenue dans un DataGridCell. Par défaut, le DataGridCell a onglet-arrêt de la fonctionnalité. Ainsi, la raison pour avoir frappé TAB deux fois pour obtenir le focus à votre contrôle de zone de texte. La solution est de désactiver le taquet de tabulation de la fonctionnalité pour le DataGridCell. Cela peut être fait par l'intermédiaire d'un style pour le DataGridCell.
Voici la solution:
Voici ma démarche. Son très proche de @Nalin Jayasuriya réponse, mais je ne voulais pas créer un style. Aussi cette solution sélectionne le texte dans la zone de texte. De toute façon - le code XAML pour le trou de la grille de données qui ressemble à ça.
Et le code-behind.
Pour plus d'infos, jetez un oeil à mon blog:
http://blog.baltz.dk/post/2014/11/28/WPF-DataGrid-set-focus-and-mark-text
Mon approche est d'utiliser un TriggerAction qui définit le focus à l'élément de modèle que vous voulez, quand il charge.
Le déclencheur est très simple:
Le DataTemplate ressemble à ceci:
Vous pouvez écrire d'autres déclencheurs pour d'autres types d'éléments.