DataGrid的单元格编辑模板和编辑模式下的焦点

21

我在使用 WPFToolkit 的 DataGrid 时遇到了问题,当一个列同时提供 CellTemplateCellEditingTemplate 自定义时。如果您看下面代码,您会发现我的编辑模板中只有一个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>
3个回答

27

试试这个

<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"更改为这个就可以了。 - knockando

14

或者是这个...

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

你也可以将它移动到一个样式中.. <Style x:Key="MyStyle" TargetType="CheckBox"> <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"/> </Style> - SteffenSH
很棒的工作。尽管最初由于我在DataGrid上使用SelectedItem属性而无法正常工作。但是我将其删除并将SelectionUnit =“Cell”更改,这样就可以正常工作了。 - knockando
1
这行代码"{Binding RelativeSource={RelativeSource Self}}"实际上是做什么的? - Yola

4

如果您想将焦点设置在编辑器上并选择由绑定提供的文本,请尝试以下方法。

<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);
}

谢谢,这很有帮助! - mack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接