Ваша проблема проистекает из того факта, что каждая ячейка помещает свой редактор в элемент управления контентом, который сначала получает фокус, а затем вы должны снова перейти к редактору. Если вы посмотрите на код для DataGridTemplateColumn в методе GenerateEditingElement, он вызывает метод LoadTemplateContent, который делает это:
private FrameworkElement LoadTemplateContent(bool isEditing, object dataItem, DataGridCell cell)
{
DataTemplate template = ChooseCellTemplate(isEditing);
DataTemplateSelector templateSelector = ChooseCellTemplateSelector(isEditing);
if (template != null || templateSelector != null)
{
ContentPresenter contentPresenter = new ContentPresenter();
BindingOperations.SetBinding(contentPresenter, ContentPresenter.ContentProperty, new Binding());
contentPresenter.ContentTemplate = template;
contentPresenter.ContentTemplateSelector = templateSelector;
return contentPresenter;
}
return null;
}
Посмотрите, как он создает нового предъявителя контента для вставки шаблона. Другие люди решали эту проблему различными способами, я получил свой собственный тип столбца, чтобы справиться с этим. (поэтому я не создаю дополнительный элемент и не настраиваю предъявителя контента на получение фокуса). В этом примере они используют диспетчер фокуса для решения той же проблемы (я не проверял этот код)
<tk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid FocusManager.FocusedElement="{Binding ElementName=txt1}">
<TextBox Name="txt1" Text="{Binding XPath=@ISBN}"
BorderThickness="0" GotFocus="TextBox_GotFocus"/>
</Grid>
</DataTemplate>
</tk:DataGridTemplateColumn.CellEditingTemplate>
Если у вас есть пользовательский элемент управления в качестве редактора, вы можете использовать шаблон с менеджером фокуса или использовать обработчик событий для события OnLoaded.