2010-12-07 11 views
0

Je rencontre un comportement étrange dans mon DataGrid quand j'ai un second DataGrid en tant que rowdetailstemplate. La grille de données principale est liée à ma collection d'éléments et les détails de la grille de données sont liés à une collection de sous-éléments contenus dans un élément. Maintenant tout cela est parfaitement rendu, mais quand je veux cliquer directement sur une cellule dans le SubItemsGrid, il sélectionne d'abord la première cellule de la ligne dans la grille principale dans laquelle le SubItemsGrid est contenu. Je dois cliquer une deuxième fois pour arriver à la cellule que je veux sélectionner.Sélection d'une cellule d'un DataGrid WPF qui se trouve dans un RowDetailsTemplate

Est-ce que quelqu'un a expérimenté cela aussi? Et si oui, y a-t-il une solution?

Ceci est mon mark-up (en partie):

<DataGrid x:Name="ItemGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" SelectionUnit="Cell" 
      RowDetailsVisibilityMode="Visible" CanUserResizeRows="False" AreRowDetailsFrozen="False" VerticalAlignment="Top" 
      CanUserAddRows="False" CanUserDeleteRows="False" VerticalScrollBarVisibility="Hidden"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column1" Binding="{Binding Path=ID}" Width="350"/> 
     <DataGridTextColumn Header="Column2" Binding="{Binding Path=Name}" Width="80"/> 
     <DataGridTextColumn Header="Column3" Binding="{Binding Path=Description}" Width="80"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <DataGrid x:Name="SubItemsGrid" ItemsSource="{Binding Path=SubItems}" AutoGenerateColumns="False" 
         SelectionUnit="Cell" HeadersVisibility="None" Margin="50,0,0,0" VerticalAlignment="Top" CanUserAddRows="False" 
         CanUserResizeRows="False" CanUserDeleteRows="False" BorderThickness="0"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column1" Binding="{Binding Path=Name}" Width="300" /> 
        <DataGridTextColumn Header="Column2" Binding="{Binding Path=Description}" Width="80"/> 
        <!-- Etc.--> 

--- EDIT ---

Ok, je suis venu avec l'idée de gérer l'événement de la souris sur le SubItemsGrid , puis mettre le focus sur le SubItemsGrid dans le code, comme ceci:

private void SubItemsGrid_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    DataGrid selectedGrid = sender as DataGrid; 
    if (selectedGrid != null) 
    { 
     selectedGrid.Focus() 
    } 
} 

Debugging montrent que la méthode « focus » est appelée sur la grille à droite, mais je ne reçois aucun résultat visuel. J'ai l'impression d'être très proche de la solution. N'importe qui?

Répondre

0

J'ai corrigé cela en attrapant l'événement 'SelectedCellsChanged' du SubItemsGrid. Dans le gestionnaire j'ai appelé 'BeginEdit()' sur la grille qui a déclenché l'événement. Cela met en effet l'accent sur la cellule cliquée directement, mais aussi mettre la cellule en mode édition. C'est pourquoi j'ai appelé CancelEdit() directement après. Cela permettra de garder le focus sur la cellule, mais pas en mode édition.

private void SubItemsGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
{ 
    DataGrid selectedGrid = sender as DataGrid; 
    if (selectedGrid != null) 
    { 
     selectedGrid.BeginEdit(); 
     selectedGrid.CancelEdit(); 
    } 
} 
+0

La déglutition du premier clic est quelque chose que je me suis vu, mais pas avec une grille enfant. Il est également commenté dans [ce fil sliverlight.net] (http://forums.silverlight.net/forums/p/208961/491280.aspx). Je n'ai pas encore trouvé de solution générale pour y arriver. –