下降时DataGridCell是一个TextBlock,而上升时是TextBox

时间:2016-06-24 09:26:06

标签: c# wpf textbox textblock datagridcell

所以,我有一个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的事件。

2 个答案:

答案 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>