如何在DataGridTemplateColumn中的编辑文本框获得焦点时选择所有文本?

Gis*_*shu 8 wpf datagrid wpftoolkit wpf-4.0

我正在尝试使DataGridTemplateColumn的行为与TextColumn完全相同

  • 当单元格进入编辑模式(按F2)时,用户可以立即开始输入新值
  • 默认情况下,选择现有文本内容 - 以便您可以轻松设置新值

完成了第一个; 但是选择所有文本都不起作用.正如许多帖子所提到的,尝试挂钩到GotFocus事件并选择代码隐藏中的所有文本.这适用于独立的文本框; 但是对于作为TemplateColumn的编辑控件的文本框,这不起作用.

有任何想法吗?代码示例:

<Window.Resources>
            <Style x:Key="HighlightTextBoxStyle" TargetType="{x:Type TextBox}">
                <EventSetter Event="GotFocus" Handler="SelectAllText"/>
                <EventSetter Event="GotMouseCapture" Handler="SelectAllText"/>
                <Setter Property="Background" Value="AliceBlue"/>
            </Style>

            <DataTemplate x:Key="DefaultTitleTemplate">
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
            <DataTemplate x:Key="EditTitleTemplate">
                    <TextBox x:Name="Fox"
                         FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"  
                         Text="{Binding Path=Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                         Style="{StaticResource HighlightTextBoxStyle}">
                    </TextBox>
            </DataTemplate>
        </Window.Resources>
        <DockPanel>
            <TextBox DockPanel.Dock="Top" x:Name="Test" Text="{Binding Path=(FocusManager.FocusedElement).Name, ElementName=MyWindow}" 
                     Style="{StaticResource HighlightTextBoxStyle}"/>
            <toolkit:DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTemplateColumn Header="Templated Title" 
                        CellTemplate="{StaticResource DefaultTitleTemplate}"
                        CellEditingTemplate="{StaticResource EditTitleTemplate}" />

                    <toolkit:DataGridTextColumn Header="Title" Binding="{Binding Path=Title}" />
                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>
        </DockPanel>
Run Code Online (Sandbox Code Playgroud)

Gis*_*shu 7

错过用答案更新帖子...

问题似乎是对于自定义数据网格列(又名DataGridTemplateColumn),网格无法知道编辑控件的确切类型(通过DataTemplate指定并且可以是任何内容).对于DataGridTextColumn,编辑控件类型是已知的,因此网格可以找到它并在其中调用SelectAll().

因此,要实现TemplateColumn的最终目标,您需要提供帮助.我第一次忘记了我是如何解决它的......但这是我今天搜索过的东西.使用PrepareCellForEdit方法的覆盖创建TemplateColumn的自定义派生,如下所示(使用您的确切编辑控件交换文本框).

public class MyCustomDataColumn : DataGridTemplateColumn
    {
        protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
        {
            var contentPresenter = editingElement as ContentPresenter;

            var editingControl = FindVisualChild<TextBox>(contentPresenter);
            if (editingControl == null)
                return null;

            editingControl.SelectAll();
            return null;
        }

        private static childItem FindVisualChild<childItem>(DependencyObject obj) 
    }
Run Code Online (Sandbox Code Playgroud)

这是FindVisualChild一个实现.

XAML:

   <WPFTestBed:MyCustomDataColumn Header="CustomColumn"
                    CellTemplate="{StaticResource DefaultTitleTemplate}"
                    CellEditingTemplate="{StaticResource EditTitleTemplate}"/>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

很多代码令人讨厌的不一致.

  • 在我的情况下,我还必须将焦点设置到编辑 TextBox `editingControl.Focus();` `editingControl.SelectAll();` (2认同)