2016-06-08 2 views
0

사용자가 Alt + X를 누르면 DataGridTextColumn의 캐럿 위치에 텍스트를 어떻게 삽입합니까? 바로 가기를 누르면 WPF DataGrid 셀의 캐럿 위치에 텍스트를 프로그래밍 방식으로 삽입하십시오.

내가 내 자신의 CellEditingTemplate과 CellTemplate을 만들기 위해 노력 한 데이터 그리드

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

입니다. 그러나 그리드의 탭 기능을 엉망으로 만든다. 다음 셀을 편집하려면 이중화 또는 삼중 탭해야합니다.

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

코드 숨김. 캐럿 위치를 알아야하기 때문에 databound 모델에 텍스트를 직접 삽입 할 수 없습니다.

답변

0

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 속성에 텍스트를 삽입하여 익숙한 동작을 얻은 다음 삽입 된 텍스트 뒤에 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; 
     } 
    } 
관련 문제