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

时间:2014-07-12 12:28:43

标签: c# wpf datagrid

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

到目前为止我尝试了什么:

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

<Style TargetType="{x:Type DataGridCell}">
    <EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus" />
</Style>

在窗口的代码背后:

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

以上问题尝试:

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

2 个答案:

答案 0 :(得分:3)

在焦点上,单元格进入编辑模式,但textBox没有键盘焦点,因此下一个标签按下将被textBox 占用,并将获得焦点。

正如您所提到的,您必须按两次 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>

背后的代码

private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
    (sender as TextBox).Focus();
}

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


如果您不想拥有处理程序,也可以使用 interactivity 触发器执行此操作,例如定义here

<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>

和行为触发操作:

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

答案 1 :(得分:0)

这是一个让它可编辑的技巧

BeginEdit()方法将当前单元格置于编辑模式。

样品

    private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
    {
        DataGridCell cell = sender as DataGridCell;
        if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
        {
            var parent = VisualTreeHelper.GetParent(cell);
            while (parent != null && parent.GetType() != typeof(DataGrid))
            {
                parent = VisualTreeHelper.GetParent(parent);
            }
            DataGrid dGrid = parent as DataGrid;
            dGrid.BeginEdit();
        }
    }

如果您有权访问数据网格,则可能没有必要找到它

例如

    private void DataGridCell_GotFocus(object sender, RoutedEventArgs e)
    {
        DataGridCell cell = sender as DataGridCell;
        if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
        {
            dGrid.BeginEdit();
        }
    }

更新:FocusManager技巧

如果焦点是唯一可以通过设置FocusManager来利用FocusManager.FocusedElement的问题。尝试一下,它有效without any code behind

样品

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Name}" 
                     FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

请注意,我已通过绑定到self将FocusedElement设置为TextBox,这将使TextBox在加载后进入焦点(当它进入编辑模式时)