2011-10-19 4 views
1

J'utilise une AutoCompleteBox de la boîte à outils WPF dans le modèle d'édition de DataGridTemplateColumn dans WPF4. Cela fonctionne assez bien pour la plupart des fois une fois que j'ai résolu tous les problèmes de reliure agaçants autour de la liaison DataGrid et aussi les pièges et l'incomplétude propres à AutoCompleteBox. Jusqu'ici tout va bien. Le problème est la navigation au clavier.WPF AutoCompleteBox dans les problèmes de navigation au clavier DataGridTemplateColumn

Voici le scénario: il existe un DataGrid avec deux colonnes. Le premier est un DataGridTemplateColumn qui a un AutoCompleteBox dans son modèle d'édition. La seconde est juste un DataGridTextColumn ordinaire.

Si j'appelle l'édition d'une ligne, je peux choisir un élément dans la saisie semi-automatique. J'appuie sur tab pour passer à la colonne suivante, mais à la place la ligne edit est validée, et le focus du clavier ne passe pas à la colonne suivante. S'il s'agissait d'un DataGridTextColumn, il resterait en mode édition et me laisserait éditer la colonne suivante. Cela arrive aussi pour les nouvelles lignes. Pour moi, il semble que WPF décide d'envoyer le focus au clavier à la sortie de la boîte de saisie automatique, mais je ne sais pas ce que je peux y faire, et je n'ai pas été capable de trouver quelqu'un qui parle du même problème, ce qui suggère soit que je fais quelque chose de mal ou que personne d'autre ne se soucie de la navigation au clavier à travers leurs grilles. J'ai utilisé une sous-classe TemplateColumn qui remplace PrepareCellForEditing pour s'assurer que le focus atterrit dans AutoCompleteBox immédiatement lors de l'édition de la cellule (comme dans les autres réponses ici), mais le problème persiste si je désactive tout ce code. tricherie autant que je peux dire.

Des idées? Le XAML ressemble plus ou moins à ceci (simplifié, bien sûr, la grille a beaucoup plus de deux colonnes et une liaison de données plutôt compliquée en cours - j'ai omis les liaisons et je l'ai gardé dans la structure globale).

<DataGrid> 
    <DataGridTemplateColumn Header="AutoCompleteBox"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate><TextBlock /></DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
     <toolkit:AutoCompleteBox> 
      <!-- autocompletebox's item template etc. --> 
     </toolkit:AutoCompleteBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
    </DataGridTemplateColumn> 
    <DataGridTextColumn Header="Text" /> 
</DataGrid> 

Répondre

2

Pour déplacer le focus à la colonne suivante, je l'ai fait la classe étendue (onglet fonctionne très bien pour moi):

public class ExAutoCompleteBox : AutoCompleteBox 
{ 
     public ExAutoCompleteBox() 
     { 
      PreviewKeyUp += (o, e) => 
      { 
       if (e.Key == Key.Enter) 
       { 
        ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
       } 
      }; 
     } 
} 
+0

C'est exactement ce que je devrais avoir pensé à l'époque, thankyou. Comme il s'est avéré, nous avons fini par utiliser ItemsControl et ListBox avec divers ItemTemplates élaborés à la place, et nous sommes plus heureux avec cela en général, mais merci d'avoir répondu! –

Questions connexes