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.
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() –
N'avez-vous pas juste besoin de focaliser et de sélectionner tout sur Loaded auquel vous pouvez vous abonner sur le TextBox? –
(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.) –