2016-06-24 2 views
0

Alors, j'ai un DataGrid, qui contient des éléments qui ressemblent à ceci:DataGridCell est un TextBlock en descendant, mais TextBox en remontant

<DataGridTextColumn Header="Dto 1" Binding="{Binding Path=Dto1}"> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="{x:Type TextBox}"> 
      <EventSetter Event="PreviewKeyDown" Handler="TextBox_PreviewKeyDown"/> 
      <EventSetter Event="GotFocus" Handler="TextBox_GotFocus"/> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 
</DataGridTextColumn> 

Le PreviewKeyDown fonctionne parfaitement bien, quand je vais, je Je suis capable de retourner à la cellule sans problème. La façon dont je le vois, à toutes fins utiles, j'ai un TextBox là-dedans.

Maintenant, lorsque je tente de descendre de la cellule dans un événement:

private void dgPropuestas_GotFocus(object sender, RoutedEventArgs e) { 
     var cell = e.OriginalSource as DataGridCell; 
     if (cell != null) { 
      var cp = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(cell, 0), 0) as ContentPresenter; 
      var tb = cp.Content as TextBlock; 
      if (tb != null) 
       tb.Focus(); 
     } 
    } 

(Note: je mets la méthode VisualTreeHelper, je fais deux fois manuellement ont la FindVisualChildren, mais je suis passé par l'arbre manuellement et comme un acte de désespoir pour accélérer un peu, je le mets manuellement)

Si j'essaie de déclarer tb en tant que cp.Content que TextBox, j'obtiens une valeur nulle. Pour certaines raisons, le ContentPresenter a un TextBlock, pas un TextBox. FindVisualChildren (cell) renvoie un IEnumerable vide.

Pourquoi est-ce un problème? Parce que je dois être capable d'appeler SelectAll() sur le texte, et textBlock n'offre pas cette option. Toute aide est grandement appréciée. Merci d'avance! Modification ultérieure: Apparemment, lorsqu'il n'est pas en mode édition, la grille de données contient un bloc de texte. En mode édition, une zone de texte. Maintenant, datagrid.BeginEdit() ne semble pas fonctionner, car il n'initialise pas le TextBox et ne déclenche pas l'événement de PrepareCellForEditing.

Répondre

0

Étant donné que la zone de texte ne serait pas initialisées avec BeginEditing() ni avec IsEditing = true, le problème a été résolu en déclarant les champs comme les forçant TextBox et sur la grille de données:

<DataGridTemplateColumn Header="Dto 2"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <TextBox Text="{Binding Dto2}" GotFocus="TextBox_GotFocus" PreviewKeyDown="TextBox_PreviewKeyDown"/> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 
0

Approche totale de ce mauvais sens. Vous vous abonnez aux événements sur un TextBox, donc le sender sera toujours dit TextBox.

+0

je pas tout à fait Comprends ce que tu veux dire. J'ai seulement TextBoxes dans mon DataGrid, ce que j'essaye de faire est de déplacer le foyer à un autre TextBox. Chose est, j'utilise les touches fléchées pour naviguer dans le DataGrid, donc chaque fois que j'appuie sur une touche fléchée, le focus est réglé sur la cellule suivante. Là où je veux pouvoir sélectionner mon TextBox et faire un SelectAll() –

+0

N'avez-vous pas juste besoin de focaliser et de sélectionner tout sur Loaded auquel vous pouvez vous abonner sur le TextBox? –

+0

(De plus, la colonne de texte par défaut fait déjà la mise au point et sélectionne le texte par défaut, ce qui vous obligerait à entrer par programmation en mode édition.) –