Bonjour à tous,

J'ai actuellement une fenêtre avec un DataGrid qui comporte une CheckBox via une DataGridTemplateColumn.

Pour tenter de récupérer la checkbox de chaque enregistrement, j'utilise l'événement LoadingRow de la DataGrid et j'essaye de récupérer le contenu de la cellule qui m'intéresse (en récupérant une DataGridCell).

Le problème, c'est que comme contenu de cellule je ne peux récupérer qu'un ContentPresenter qui ne m'aide pas du tout, puisque son contenu à lui (.Content) n'est pas une CheckBox mais un DataRowView. Donc pas moyen de récupérer la checkbox telle quelle.

De la même manière, en parcourant toutes les checkbox présentes dans ma DataGrid à l'aide du VisualTreeHelper, je me rends compte qu'aucune d'entre elles n'a de parent....

Comment faire en sorte que le ContentPresenter en question puisse me donner accès à la checkbox qui m'intéresse ?

Voici le code Xaml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<wpftk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="2,2,2,2" x:Name="grdApplicationStates" AlternatingRowBackground="#DBE6F7" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" CanUserAddRows="False" HorizontalScrollBarVisibility="Hidden" IsTextSearchEnabled="True" RowHeight="18" RowHeaderWidth="0" SelectionMode="Single" VerticalGridLinesBrush="#688CAF" HorizontalGridLinesBrush="#688CAF">
                            <wpftk:DataGrid.Columns>
                                <wpftk:DataGridTemplateColumn Width="35">
                                    <wpftk:DataGridTemplateColumn.HeaderTemplate>
                                        <DataTemplate>
                                            <CheckBox x:Name="chkCheckAll" Checked="chkCheckAll_Checked" Unchecked="chkCheckAll_Unchecked" Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                                        </DataTemplate>                                        
                                    </wpftk:DataGridTemplateColumn.HeaderTemplate>                                    
                                    <wpftk:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <CheckBox x:Name="chkCheckRow" IsChecked="{Binding IsChecked}" Visibility="Visible" VerticalAlignment="Center" HorizontalAlignment="Center" HorizontalContentAlignment="Center"/>
                                        </DataTemplate>
                                    </wpftk:DataGridTemplateColumn.CellTemplate>
                                </wpftk:DataGridTemplateColumn>
                                <wpftk:DataGridTextColumn Header="N°" Width="30" Binding="{Binding Id}" IsReadOnly="True" />
                                <wpftk:DataGridTextColumn Header="CurrentState" Visibility="Hidden" IsReadOnly="True" />
                                <wpftk:DataGridTextColumn Header="Etat courant" Width="150" Binding="{Binding CurrentState}" IsReadOnly="True" />
                                <wpftk:DataGridTextColumn Header="Message" Width="*" Binding="{Binding Message}" IsReadOnly="True" />
                                <wpftk:DataGridTextColumn Header="Temps de changement" Width="130" Binding="{Binding ChangeTime, StringFormat='dd/MM/yyyy hh:MM:ss'}" IsReadOnly="True" />
                            </wpftk:DataGrid.Columns>
                        </wpftk:DataGrid>
et voici le code permettant de récupérer une cellule en particulier :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
public DataGridCell GetCell(int row, int column)
    {
      DataGridRow rowContainer = GetRow(row);
 
      if (rowContainer != null)
      {
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
 
        // Try to get the cell but it may possibly be virtualized.
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        if (cell == null)
        {
          // Now try to bring into view and retreive the cell.
          m_DataGrid.ScrollIntoView(rowContainer, m_DataGrid.Columns[column]);
          cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        }
        return cell;
      }
      return null;
    }
 
    public DataGridRow GetRow(int index)
    {
      DataGridRow row = (DataGridRow)m_DataGrid.ItemContainerGenerator.ContainerFromIndex(index);
      if (row == null)
      {
        // May be virtualized, bring into view and try again.
        m_DataGrid.UpdateLayout();
        m_DataGrid.ScrollIntoView(m_DataGrid.Items[index]);
        row = (DataGridRow)m_DataGrid.ItemContainerGenerator.ContainerFromIndex(index);
      }
      return row;
    }
 
    public static T GetVisualChild<T>(Visual parent) where T : Visual
    {
      T child = default(T);
      int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
      for (int i = 0; i < numVisuals; i++)
      {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
          child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
          break;
        }
      }
      return child;
    }
Et dans l'événement LoadingRow :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
GetCell(index de Row, 0).Content = ??? (==> ContentPresenter)
Quelqu'un aurait une idée ?

D'avance merci à tous.