Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridTemplateColumn在选择时开始编辑_C#_Wpf_Wpfdatagrid - Fatal编程技术网

C# DataGridTemplateColumn在选择时开始编辑

C# DataGridTemplateColumn在选择时开始编辑,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,我将DataGridTemplateColumn子类化以定义自定义列类型。我使用以下代码初始化编辑模式 protected override object PrepareCellForEdit( FrameworkElement editingElement, RoutedEventArgs editingEventArgs) { editingElement.MoveFocus( new TraversalRequest(

我将
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();
        }            
    }
问题是,
PrepareCellForEdit
只有在I 1)单击单元格并再次单击以进入编辑模式后才会被调用

    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();
        }            
    }
使用
DataGridTextColumn
我可以选择单元格并键入一些文本,无需再次单击即可立即进入编辑模式。我希望我的列类型具有相同的行为


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

我终于想出了以下解决方案:

<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
触发器仅对第一次选择有效