Итак, у меня есть DataGrid, который содержит элементы, которые выглядят так:
<DataGridTextColumn Header="Dto 1" Binding="{Binding Path=Dto1}">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<EventSetter Event="PreviewKeyDown" Handler="TextBox_PreviewKeyDown"/>
<EventSetter Event="GotFocus" Handler="TextBox_GotFocus"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
PreviewKeyDown работает отлично, когда я поднимаюсь, я могу без проблем вернуться в ячейку. Как я это вижу, для всех намерений и целей у меня есть TextBox.
Теперь, когда я пытаюсь спуститься с ячейки в событии:
private void dgPropuestas_GotFocus(object sender, RoutedEventArgs e) {
var cell = e.OriginalSource as DataGridCell;
if (cell != null) {
var cp = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(cell, 0), 0) as ContentPresenter;
var tb = cp.Content as TextBlock;
if (tb != null)
tb.Focus();
}
}
(Примечание: я дважды устанавливал метод VisualTreeHelper вручную, у меня есть метод FindVisualChildren, но я просмотрел дерево вручную и в отчаянии, чтобы немного ускориться, я поставил его вручную)
Если я попытаюсь объявить tb как cp.Content как TextBox, я получу ноль. По какой-то причине ContentPresenter имеет внутри TextBlock, а не TextBox. FindVisualChildren(cell) возвращает пустой IEnumerable.
Почему это проблема? Потому что мне нужно иметь возможность вызывать SelectAll() для текста, а textBlock не предлагает такой возможности. Любая помощь приветствуется. Заранее спасибо!
Позднее редактирование: по-видимому, когда не в режиме редактирования, сетка данных содержит текстовый блок. В режиме редактирования текстовое поле. Теперь datagrid.BeginEdit(), похоже, не работает, поскольку он не инициализирует TextBox и не запускает событие PrepareCellForEditing.