La valeur de la cellule WPF DataGrid a changé d’événement

J’ai une configuration qui ressemble à ceci:

// myDG is a DataGrid whose columns are DataGridTextColumn ObservableCollection myOC; // myOC is populated with some new MyItem myDG.ItemsSource = myOC; 

MyItem implémente INotifyPropertyChanged . Quel est le moyen de bien attraper lorsque l’ utilisateur entre une valeur dans une cellule?

J’ai essayé de MyItem PropertyChanged sur les MyItem , mais je mets également à jour les valeurs en arrière-plan (l’idée est que lorsque l’utilisateur modifie manuellement la valeur, un indicateur est déclenché qui indique le calcul périodique pour éviter d’écraser les données saisies manuellement. ). Donc, PropertyChanged intercepte tout, y compris les mises à jour périodiques, ce que je ne souhaite pas. Je suppose qu’il est possible de résoudre ce problème (en définissant un indicateur lors du calcul périodique, puis en vérifiant l’absence d’indicateur dans le gestionnaire d’événements PropertyChanged – mais je veux savoir s’il existe une solution plus simple.)

J’ai essayé d’attraper myDG.CurrentCellChanged mais cela se déclenche à chaque fois que l’utilisateur modifie la sélection de cellule, pas spécifiquement lorsqu’il modifie le contenu de la cellule.

Edit: Voici le XAML:

       

Voici l’implémentation de MyItem (utilise Fody / PropertyChanged ):

 [ImplementPropertyChanged] class MyItem : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public ssortingng Prop1 { get; set; } public ssortingng Prop2 { get; set; } public MyItem() { Prop1 = Prop2 = ""; } } 

La solution consistait à intercepter l’événement CellEditEnding .

 // In initialization myDG.CellEditEnding += myDG_CellEditEnding; void myDG_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { if (e.EditAction == DataGridEditAction.Commit) { var column = e.Column as DataGridBoundColumn; if (column != null) { var bindingPath = (column.Binding as Binding).Path.Path; if (bindingPath == "Col2") { int rowIndex = e.Row.GetIndex(); var el = e.EditingElement as TextBox; // rowIndex has the row index // bindingPath has the column's binding // el.Text has the new, user-entered value } } } }