2010-10-19 18 views
16

Tengo un problema con WPFToolkit DataGrid cuando se personaliza una columna que proporciona CellTemplate y CellEditingTemplate. Si echas un vistazo a continuación, verás que mi plantilla de edición tiene un solo CheckBox. Todo está bien en un sentido funcional, pero cuando se pulsa F2 para editar la celda, también se debe presionar TAB para que el CheckBox reciba el foco. Idealmente, uno presionaría F2 y SPACE para alternar el valor. Actualmente, uno debe presionar F2, TAB, SPACE. He intentado configurar TabIndex en vano. Me estoy quedando sin ideas.CellEditingTemplate de DataGrid y enfoque en el modo de edición

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

Respuesta

20

probar este

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

funciona como un encanto. ¡Gracias! – wpfwannabe

+0

¡Gracias un millón de veces! – Dabblernl

+0

Buen trabajo. Aunque no funcionó inicialmente porque estaba trabajando con la propiedad SelectedItem en DataGrid. Se eliminó y cambió SelectionUnit = "Cell" y esto funcionó. – knockando

12

O esto ...

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

También podría moverlo a un estilo .. SteffenSH

+0

Buen trabajo. Aunque no funcionó inicialmente porque estaba trabajando con la propiedad SelectedItem en DataGrid. Se eliminó y cambió SelectionUnit = "Cell" y esto funcionó. – knockando

+1

¿Qué hace esta línea en realidad '" {Vinculante RelativeSource = {RelativeSource Self}} "'? – Yola

0

si desea establecer el foco en editar y seleccione el texto dado por una encuadernación probar esto.

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

código detrás:

private void TbLoaded(object sender, EventArgs e) 
{ 
    TextBox tb = sender as TextBox; 
    if (tb == null) return; 

    tb.SelectAll(); 
    FocusManager.SetFocusedElement(this, tb); 
} 
Cuestiones relacionadas