2014-01-10 108 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觸發器僅適用於第一個選擇。