我将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
处理程序,但事件不会被触发。
答案 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
触发器仅适用于第一次选择。