DataGridCell向下时是TextBlock,向上时是TextBox
本文关键字:TextBox TextBlock DataGridCell | 更新日期: 2023-09-27 17:49:22
那么,我有一个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不提供该选项。非常感谢任何帮助。提前感谢!
Later Edit:显然,当不处于编辑模式时,数据网格包含一个文本块。在编辑模式下,文本框。现在,datagrid.BeginEdit()似乎不起作用,因为它没有初始化TextBox,也没有触发PrepareCellForEditing的事件。
这完全是错误的方法。您在TextBox
上订阅事件,因此sender
将始终表示为TextBox
。
考虑到TextBox不会被BeginEditing()和isEditing = true初始化,这个问题是通过将字段声明为TextBox并将它们强制到数据网格上来解决的:
<DataGridTemplateColumn Header="Dto 2">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Dto2}" GotFocus="TextBox_GotFocus" PreviewKeyDown="TextBox_PreviewKeyDown"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>