如何在获得焦点后立即将单元格置于编辑模式

Vis*_*hal 4 c# wpf datagrid

假设我有一个 DataGrid。假设所有列都是 TemplateColumns。当任何单元格获得焦点时,我希望它进入 EditMode。

到目前为止我尝试过的:

我为 DataGridCell 创建了一个样式,如下所示:

<Style TargetType="{x:Type DataGridCell}">
    <EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus" />
</Style>
Run Code Online (Sandbox Code Playgroud)

在窗口的代码隐藏中:

private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
    {
        cell.IsEditing = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的问题尝试:

我必须单击单元格才能将其置于编辑模式。

Roh*_*ats 5

在焦点上,单元格进入编辑模式,但文本框没有键盘焦点,因此下一次按 Tab 键将被文本框吃掉并获得焦点。

正如您提到的,您必须按Tab两次才能将焦点移到下一个单元格。您可以做的是将焦点放在加载事件上的 TextBox 上

虚拟元素的XAML

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Name}" Loaded="TextBox_Loaded"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

背后的代码

private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
    (sender as TextBox).Focus();
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将处理程序移动到 dataGrid 中所有文本框的某种基本样式,这样您就不必为所有单元格挂接处理程序。


如果你不想有处理程序,你也可以使用这里interactivity定义的触发器来做到这一点

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Name}">
            <Interactivity:Interaction.Triggers>
                <Interactivity:EventTrigger EventName="Loaded">
                    <local:TakeFocusAction />
                </Interactivity:EventTrigger>
            </Interactivity:Interaction.Triggers>
        </TextBox>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
Run Code Online (Sandbox Code Playgroud)

和行为触发动作:

public class TakeFocusAction : TriggerAction<UIElement>
{
    protected override void Invoke(object parameter)
    {
        AssociatedObject.Focus();
    }
}
Run Code Online (Sandbox Code Playgroud)