所以,我有一个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,我得到一个null。 出于某种原因,ContentPresenter内部有TextBlock,而不是TextBox。 FindVisualChildren(cell)返回一个空的IEnumerable。
为什么这是一个问题?因为我需要能够在文本上调用SelectAll(),而textBlock不提供该选项。 任何帮助是极大的赞赏。 提前谢谢!
稍后编辑:显然,当不处于编辑模式时,数据网格包含一个文本块。在编辑模式下,文本框。现在,datagrid.BeginEdit()似乎不起作用,因为它没有初始化TextBox,也没有触发PrepareCellForEditing的事件。
答案 0 :(得分:0)
完全接近这个错误的方式。您订阅TextBox
上的活动,因此始终会sender
TextBox
。{/ p>
答案 1 :(得分:0)
鉴于TextBox不会使用BeginEditing()或isEditing = true进行初始化,因此通过将字段声明为文本框并将其强制到数据网格来解决问题:
<DataGridTemplateColumn Header="Dto 2">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Dto2}" GotFocus="TextBox_GotFocus" PreviewKeyDown="TextBox_PreviewKeyDown"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>