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