我在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>
答案 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));
}
};
}
}