2014-01-10 81 views
1

I subclassed DataGridTemplateColumn定义自定义列类型。我使用下面的代码来初始化编辑模式。DataGridTemplateColumn BeginEdit on selected

protected override object PrepareCellForEdit(
     FrameworkElement editingElement, RoutedEventArgs editingEventArgs) 
    { 
     editingElement.MoveFocus(
      new TraversalRequest(FocusNavigationDirection.First)); 
     return base.PrepareCellForEdit(editingElement, editingEventArgs); 
    } 

    private void MyTextControlGotFocus(object sender, RoutedEventArgs e) 
    { 
     var control = sender as MyTextControl; 
     if (control != null) 
     { 
      control.SelectAll(); 
     }    
    } 

的问题是,经过我1)点击进入细胞和2)再次点击进入编辑模式PrepareCellForEdit被称为只。

随着DataGridTextColumn我可以选择单元格并键入一些文本立即进入编辑模式,而无需再次点击。我想为我的列类型使用相同的行为。

问题是,如何处理单元格上的KeyDown事件,以便在我的DataGridTemplateColumn类中调用DataGridOwner.BeginEdit。我试图向CellTemplate内的控件添加一个PreviewKeyDown处理程序,但该事件未被触发。

回答

1

我终于想出了这个soultion:

<DataGrid ItemsSource="{Binding Persons}"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Header="C1"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Name}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
    <DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Focusable" Value="False" /> 
     <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="IsEditing" Value="True" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </DataGrid.CellStyle> 
</DataGrid> 

的重要组成部分,是Focusable=False(不知道为什么)。否则,IsSelected触发器仅适用于第一个选择。