1

WPF4 の DataGridTemplateColumn の編集テンプレート内で、WPF ツールキットの AutoCompleteBox を使用しています。DataGrid バインディングと AutoCompleteBox 独自の落とし穴と不完全さに関するすべての厄介なバインディングの問題を整理すると、ほとんどの部分で十分に機能します。ここまでは順調ですね。問題はキーボード ナビゲーションです。

これがシナリオです。2 つの列を持つ DataGrid があります。1 つ目は、編集テンプレートに AutoCompleteBox を持つ DataGridTemplateColumn です。2 つ目は、通常の DataGridTextColumn です。

行の編集を呼び出すと、AutoCompleteBox 内の項目を選択できます。Tab キーを押して次の列に移動しますが、代わりに行の編集がコミットされ、キーボード フォーカスが次の列に移動しません。これが DataGridTextColumn の場合、編集モードのままで、次の列を編集できます。これは、新しい行でも発生します。

私の考えでは、オートコンプリートボックスから出てきたときにWPFがキーボードフォーカスを送信することを決定した場所に問題があるようですが、それについて何ができるかわかりません。また、見つけることもできませんでした同じ問題について話している人がいます。これは、私が何か間違ったことをしている、またはグリッドを介したキーボード ナビゲーションを誰も気にしていないことを示唆しています。私は、PrepareCellForEditing をオーバーライドする TemplateColumn サブクラスを使用して、セルの編集時にフォーカスが AutoCompleteBox にすぐに移動するようにしています (ここの他の回答に従って)。私が知る限りの策略。

何か案は?

XAML は多かれ少なかれこのように見えます (もちろん、単純化すると、グリッドには 3 つ以上の列があり、かなり複雑なデータ バインディングが行われています。バインディングは省略して、全体の構造のままにしています)。

<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>
4

1 に答える 1

2

フォーカスを次の列に移動するために、拡張クラスを作成しました(タブは私にとっては正常に機能します):

public class ExAutoCompleteBox : AutoCompleteBox
{
        public ExAutoCompleteBox()
        {
            PreviewKeyUp += (o, e) =>
            {
                if (e.Key == Key.Enter)
                {
                    ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            };
        }
}
于 2011-12-08T10:22:29.707 に答える