WPF AutoCompleteBox dans les questions de navigation du clavier DataGridTemplateColumn

StackOverflow https://stackoverflow.com/questions/7820179

  •  26-10-2019
  •  | 
  •  

Question

J'utilise un AutoCompleteBox de la boîte à outils WPF dans un modèle de l'édition de DataGridTemplateColumn dans WPF4. Il fonctionne assez bien pour la plupart une fois que je triai toutes les questions de liaison tatillonne autour de la liaison DataGrid et aussi propres et gotchas incomplétude de AutoCompleteBox. Jusqu'ici tout va bien. Le problème est la navigation du clavier.

Voici le scénario: il y a une grille de données avec deux colonnes. Le premier est un DataGridTemplateColumn qui a une AutoCompleteBox dans son gabarit de montage. Le second est juste un DataGridTextColumn ordinaire.

Si je invoque la modification d'une ligne, je peux choisir un élément dans la AutoCompleteBox. onglet I de presse pour passer à la colonne suivante, mais la modification de la ligne s'engage, et la mise au point du clavier ne se déplace pas à la colonne suivante. Si cela était un DataGridTextColumn, il reste en mode édition et laissez-moi modifier la colonne suivante. Cela se produit également pour les nouvelles lignes.

A mon avis, il semble qu'il y ait quelque chose de mal avec lequel WPF décide d'envoyer le focus du clavier quand il sort de la AutoCompleteBox, mais je ne peux pas comprendre ce que je peux faire à ce sujet, et je l'ai pas non plus été capable de trouver parler de qui que ce soit sur le même problème, ce qui suggère soit que je fais quelque chose de mal ou d'autre personne ne se soucie de la navigation du clavier à travers leurs grilles. J'utilise une sous-classe TemplateColumn qui l'emporte sur PrepareCellForEditing pour assurer les terres de mise au point dans le AutoCompleteBox immédiatement sur la modification de la cellule (comme pour les autres réponses ici), mais le problème persiste si je désactive tout ce code il est donc pas un effet de ce morceau de la ruse pour autant que je peux dire.

Toutes les idées?

Le XAML ressemble plus ou moins comme celui-ci (simplifié, bien sûr, la grille a beaucoup plus de deux colonnes et certains vont de liaison de données assez compliquée - je l'ai laissé les fixations et il a continué à 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>
Était-ce utile?

La solution

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));
                }
            };
        }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top