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

时间:2016-06-08 13:33:47

标签: c# wpf datagrid datagridtextcolumn

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

这是DataGrid

<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功能。我必须使用double或tripple-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
    }

1 个答案:

答案 0 :(得分:1)

添加一个样式,在ClipEown事件的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属性上插入文本以获得熟悉的行为,然后将carret移动到插入的文本之后。

    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;
        }
    }