Bonjour,

Je travaille actuellement sur une application en wpf c#.
J'ai défini un datagrid et je fais un binding d'une liste d'éléments dessus.
J'aimerai ajouter un événement sur mon datagrid qui me permettrait de recupérer le contenu d'une cellule grâce au clic de la souris.

Pour l'instant j'ai tésté quelques exemples trouvés sur les forums et blogs. J'arrive juste à recupérer tous les éléments d'une ligne mais pas d'une cellule.

Voici un bout de code qui me permet de faire ça.
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
 
 private void myDatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            foreach (var item in e.AddedCells)
            {
                var col = item.Column as DataGridColumn;
                var fc = col.GetCellContent(item.Item);
 
                if (fc is TextBlock)
                {
                    MessageBox.Show("Values: " + (fc as TextBlock).Text);
                }
            }
 
 
        }
J'ai aussi:

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
55
56
57
 
 private void myDatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
          //  var p = (sender as DataGrid).CurrentItem;
            //MessageBox.Show(p);
            foreach (DataGridCellInfo cellInfo in myDatagrid.SelectedCells)
            {
                // this changes the cell's content not the data item behind it
                DataGridCell gridCell = TryToFindGridCell(myDatagrid, cellInfo);
                if (gridCell != null)
                {
                    int i = gridCell.Column.DisplayIndex;
                    TextBlock tb = gridCell.Content as TextBlock;
                    // gridCell.Background = Brushes.Red;
                    //gridCell.Content = "changed!!!";
                    MessageBox.Show("i   " + tb.Text);
                }
 
 
            }
        }
 
        static DataGridCell TryToFindGridCell(DataGrid grid, DataGridCellInfo cellInfo)
        {
            DataGridCell result = null;
            DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item);
            if (row != null)
            {
                int columnIndex = grid.Columns.IndexOf(cellInfo.Column);
                if (columnIndex > -1)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
                    result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
                }
            }
            return result;
        }
 
        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;
        }
j'ai d'abord utilisé l'event MouseDown mais ça ne fonctionne pas sur les cellules de mon datagrid. Auriez vous des suggestions qui me permettrait de recupérer une cellule donnée grace au click?

Merci d'avance