DataGridTemplateColumn键盘导航问题中的WPF AutoCompleteBox

时间:2011-10-19 10:52:44

标签: wpf datagrid autocompletebox

我在WPF4中的DataGridTemplateColumn编辑模板中使用WPF Toolkit中的AutoCompleteBox。一旦我解决了围绕DataGrid绑定的所有琐碎的绑定问题以及AutoCompleteBox自身的陷阱和不完整性,它在大多数情况下运行良好。到现在为止还挺好。问题是键盘导航。

这就是场景:有一个包含两列的DataGrid。第一个是DataGridTemplateColumn,其编辑模板中有一个AutoCompleteBox。第二个是普通的DataGridTextColumn。

如果我调用一行,我可以在AutoCompleteBox中选择一个项目。我按Tab键移动到下一列,但是行编辑被提交,键盘焦点不会移动到下一列。如果这是一个DataGridTextColumn,它将保持编辑模式,让我编辑下一列。这也适用于新行。

在我看来,似乎WPF决定在Autocompletebox出来时发送键盘焦点的地方出了问题,但是我无法弄清楚我能做些什么,而且我也没有能够找到任何人谈论相同的问题,这表明我做错了什么或没有其他人关心通过他们的网格键盘导航。我一直在使用一个TemplateColumn子类来覆盖PrepareCellForEditing,以确保在编辑单元格时立即将焦点置于AutoCompleteBox中(根据其他答案),但如果我禁用所有代码,则问题仍然存在,因此它不会影响到据我所知,这是一种诡计。

有什么想法吗?

XAML或多或少看起来像这样(简化,当然,网格有两个以上的列和一些相当复杂的数据绑定 - 我省略了绑定并将其保留在整体结构中)

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

1 个答案:

答案 0 :(得分:2)

为了将焦点转移到下一列,我已经制作了扩展类(tab对我来说很好):

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