按下快捷方式时,以编程方式在 WPF DataGrid 单元格中的插入符号位置插入文本

Insert text programmatically at caret position in WPF DataGrid cell when shortcut is pressed

如何在用户按下 Alt+X 时在 DataGridTextColumn 中的插入符号位置插入文本?

这是数据网格

<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}"  AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataGrid.Columns>
    </DataGrid>

我尝试制作自己的 CellEditingTemplate 和 CellTemplate。但是当我那样做时,它会扰乱网格的 Tab 功能。我必须按两次或三次 Tab 键才能编辑下一个单元格。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" KeyDown="TextBox_KeyDown"></TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Value}"></TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

代码隐藏。您不能将文本直接插入数据绑定模型,因为您必须知道插入符号的位置。

    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
      //Insert text at caret position
    }

添加一个样式,为 KeyDown 事件在 EditingElementStyle 上添加一个 EventSetter。

<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}"  AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="{x:Type TextBox}">
                    <EventSetter Event="KeyDown" Handler="TextBox_KeyDown" />
                </Style>
            </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

然后将事件处理程序添加到后面的代码中。在 SelectedText 属性上插入文本以获得熟悉的行为,然后将插入符号移动到插入的文本之后。

    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.SystemKey == Key.X && Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
        {
            string text = "Text to insert";
            TextBox textBox = sender as TextBox;
            textBox.SelectedText = text;
            textBox.SelectionStart = textBox.SelectionStart + text.Length;
            textBox.SelectionLength = 0;
        }
    }