DataGridTemplateColumn选择时的BeginEdit

时间:2014-01-10 13:38:26

标签: c# wpf wpfdatagrid

我将DataGridTemplateColumn子类化为定义自定义列类型。我使用以下代码初始化编辑模式。

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

问题是{I}仅在我点击进入单元格后才调用PrepareCellForEdit并且2)再次单击进入编辑模式。

使用DataGridTextColumn我可以选择单元格并键入某些文本以立即进入编辑模式而无需再次单击。我希望我的列类型具有相同的行为。

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

1 个答案:

答案 0 :(得分:1)

我终于想出了这个灵魂:

<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触发器仅适用于第一次选择。