Frage

Ich verwende eine AutoCompleteBox aus dem WPF -Toolkit in der Bearbeitungsvorlage eines DataGridTemPlateColumn in WPF4. Es funktioniert größtenteils gut genug, sobald ich alle Probleme mit der DataGrid -Bindung sowie die eigene Gotchas und Unvollständigkeit von autocompleteBox geklärt habe. So weit, ist es gut. Das Problem ist die Tastaturnavigation.

Dies ist das Szenario: Es gibt ein Datagrid mit zwei Spalten. Das erste ist ein DataGridTemPlateColumn, der eine AutoCompleteBox in seiner Bearbeitungsvorlage enthält. Der zweite ist nur ein gewöhnlicher DataGridTextColumn.

Wenn ich die Bearbeitung einer Zeile aufgerufen habe, kann ich in der AutoCompleteBox ein Element auswählen. Ich drücke die Registerkarte, um zur nächsten Spalte zu wechseln, aber stattdessen wird die Zeilenbearbeitung festgelegt, und der Tastaturfokus wechselt nicht zur nächsten Spalte. Wenn dies ein DataGridTextColumn wäre, würde er im Bearbeitungsmodus bleiben und mich die nächste Spalte bearbeiten lassen. Dies geschieht auch für neue Reihen.

Meiner Meinung nach scheint etwas nicht mit dem WPF zu stimmt, den Tastaturfokus zu senden, wenn es aus der AutoCompleteBox kommt, aber ich kann nicht herausfinden, was ich dagegen tun kann, und ich konnte auch nicht finden Jeder, der über dasselbe Problem spricht, was darauf hindeutet, dass ich etwas falsch mache oder niemand etwas über die Tastaturnavigation durch ihre Gitter kümmert. Ich habe eine TemplateColumn -Unterklasse verwendet, die das Vorbereitungsvorgang überschreibt, um sicherzustellen Trick, soweit ich das beurteilen kann.

Irgendwelche Ideen?

Das XAML sieht mehr oder weniger so aus (vereinfacht, natürlich hat das Raster viel mehr als zwei Spalten und einige ziemlich komplizierte Datenbindung - ich habe die Bindungen ausgelassen und sie an die Gesamtstruktur gehalten).

<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>
War es hilfreich?

Lösung

Für den Fokus auf die nächste Spalte, die ich erweiterte Klasse erstellt habe (Registerkarte funktioniert für mich einwandfrei):

public class ExAutoCompleteBox : AutoCompleteBox
{
        public ExAutoCompleteBox()
        {
            PreviewKeyUp += (o, e) =>
            {
                if (e.Key == Key.Enter)
                {
                    ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            };
        }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top