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的事件。

DataGridCell向下时是TextBlock,向上时是TextBox

这完全是错误的方法。您在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>