DataGrid 的 CellEditingTemplate 和焦点在编辑模式

Posted

技术标签:

【中文标题】DataGrid 的 CellEditingTemplate 和焦点在编辑模式【英文标题】:DataGrid's CellEditingTemplate and focus in edit mode 【发布时间】:2011-04-27 11:38:49 【问题描述】:

当自定义列同时提供 CellTemplateCellEditingTemplate 时,我遇到了 WPFToolkit DataGrid 的问题。如果你看看下面,你会看到我的编辑模板有一个CheckBox。从功能上来说一切都很好,但是当按下 F2 来编辑单元格时,还必须按下 TAB 才能让CheckBox 获得焦点。理想情况下,可以按 F2 和 SPACE 来切换值。目前,必须按 F2、TAB、SPACE。我尝试设置TabIndex 无济于事。我的想法不多了。

<WPFToolkit:DataGridTemplateColumn Header="Turn"
                                   MinWidth="60">
    <WPFToolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Height="16">
                <Image.Style>
                    <Style TargetType="x:Type Image">
                        <Style.Triggers>
                            <DataTrigger Binding="Binding CanTurn" Value="True">
                                <Setter Property="Source" Value="/Images/16/Tick.png" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        </DataTemplate>
    </WPFToolkit:DataGridTemplateColumn.CellTemplate>

    <WPFToolkit:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <CheckBox IsChecked="Binding Path=CanTurn" HorizontalAlignment="Center" HorizontalContentAlignment="Center" />
        </DataTemplate>
    </WPFToolkit:DataGridTemplateColumn.CellEditingTemplate>
</WPFToolkit:DataGridTemplateColumn>

【问题讨论】:

【参考方案1】:

试试这个

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <CheckBox Name="checkbox" IsChecked="Binding Path=CanTurn" HorizontalAlignment="Center" HorizontalContentAlignment="Center" />
        <DataTemplate.Triggers>
            <Trigger SourceName="checkbox" Property="IsVisible" Value="True">
                <Setter TargetName="checkbox" Property="FocusManager.FocusedElement" Value="Binding ElementName=checkbox" />
            </Trigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

【讨论】:

干得好。虽然它最初不起作用,因为我正在使用 DataGrid 上的 SelectedItem 属性。删除它并更改 SelectionUnit="Cell" 并且这有效。【参考方案2】:

或者这个……

<DataGridTemplateColumn Header="Long" IsReadOnly="False" Width="100">
  <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
      <CheckBox FocusManager.FocusedElement="Binding RelativeSource=RelativeSource Self" IsChecked="Binding Path=CanTurn" HorizontalAlignment="Center" HorizontalContentAlignment="Center" />
    </DataTemplate>
  </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

【讨论】:

你也可以将它移动到一个样式中。 干得好。虽然它最初不起作用,因为我正在使用 DataGrid 上的 SelectedItem 属性。删除它并更改 SelectionUnit="Cell" 并且这有效。 这条线实际上做了什么"Binding RelativeSource=RelativeSource Self"【参考方案3】:

如果您想将焦点设置在编辑上并选择 Binding 给出的文本,试试这个。

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Text="Binding Parameter0, Mode=TwoWay" Loaded="TbLoaded" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

后面的代码:

private void TbLoaded(object sender, EventArgs e)

    TextBox tb = sender as TextBox;
    if (tb == null) return;

    tb.SelectAll();
    FocusManager.SetFocusedElement(this, tb);

【讨论】:

谢谢,这很有帮助!

以上是关于DataGrid 的 CellEditingTemplate 和焦点在编辑模式的主要内容,如果未能解决你的问题,请参考以下文章

wpf datagrid 默认选择为最新的一行,不知道为啥设置不了

wpf datagrid 多行表头

wpf datagrid 怎么增加数据行

datagrid数据绑定的概念

vb中如何获取datagrid选中行的值?

如何用代码选中datagrid中的某一行