【问题标题】:DataGrid's CellEditingTemplate and focus in edit modeDataGrid 的 CellEditingTemplate 和焦点在编辑模式
【发布时间】: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>

【问题讨论】:

    标签: c# wpf xaml wpftoolkit wpfdatagrid


    【解决方案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);
    }
    

    【讨论】:

    • 谢谢,这很有帮助!
    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多