2015-12-22 12 views
8

Mam instalację, która wygląda tak:WPF DataGrid wartość komórki zmienione zdarzenie

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

gdzie MyItem implementuje INotifyPropertyChanged. W jaki sposób prawidłowo złapać, gdy użytkownik wprowadza wartość do komórki?

Próbowałem złapać PropertyChanged na MyItem s, ale również aktualizować wartości okresowo w tle (chodzi o to, że gdy użytkownik ręcznie edytuje wartość, zostaje wyzwolona flaga, która informuje okresowe obliczenia, aby uniknąć nadpisania ręcznie wprowadzone dane). Tak więc PropertyChanged łapie wszystko, łącznie z okresowymi aktualizacjami, których nie chcę. Przypuszczam, że można to wykonać (ustawiając flagę podczas wykonywania okresowych obliczeń, a następnie sprawdzając brak flagi na module obsługi zdarzenia PropertyChanged - ale chcę wiedzieć, czy jest prostsze rozwiązanie.)

I "Próbowałem złapać myDG.CurrentCellChanged, ale to jest wyzwalane za każdym razem, gdy użytkownik zmienia wybór komórki, a nie kiedy edytuje zawartość komórki.

Edycja: Oto XAML:

<DataGrid x:Name="myDG" ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="10,10,182,0" VerticalAlignment="Top" Height="329" ClipboardCopyMode="IncludeHeader"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Col1" Binding="{Binding Prop1}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Col2" Binding="{Binding Prop2}" IsReadOnly="False"/> 
    </DataGrid.Columns> 
</DataGrid> 

Oto realizacja MyItem (używa Fody/PropertyChanged):

[ImplementPropertyChanged] 
class MyItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 

    public MyItem() 
    { 
     Prop1 = Prop2 = ""; 
    } 
} 
+0

możesz pokazać swoją implementację XAML. –

+0

Po prostu zmień metodę ustawiania? –

+0

Czy spojrzałeś na listę wydarzeń ujawnionych przez DataGrid? https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid_events(v=vs.100).aspx – AnjumSKhan

Odpowiedz

16

Rozwiązaniem było złapać zdarzenie 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 
      } 
     } 
    } 
} 
+1

i usunąć? –

Powiązane problemy