2010-10-11 16 views
9

Wiązałem ObservableCollection do obiektu DataGrid. Gdy zmienię wartości w DataGrid, zdarzenie RowEditEnding zostanie podniesione. Ale e.Row.Item jest obiektem przed edycją, więc nie widzisz nowych wartości. Rozumiem to ze względu na EditEnding. W Silverlight masz zdarzenie EditEnded, jak mogę uzyskać obiekt z nowymi wartościami, kiedy edytuję DataGrid.WPF DataGrid ma wiersz RowEditEnding, ale nie ma wiersza RowEditEnded

Dzięki,

Filip

Odpowiedz

6

Cóż, może to może pomóc: http://wpf.codeplex.com/Thread/View.aspx?ThreadId=39356

http://blogs.msdn.com/b/vinsibal/archive/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid.aspx

Albo to, patrz punkt numer 5.

Będziesz musiał majstrować aby dostać to, co chcesz, myślę, ale mam nadzieję, że to pomaga! Lub wskazuje na dobry kierunek.

+4

Nie mogę uwierzyć, że MS nadal nie wdrożyło tak podstawowego wydarzenia. Po raz pierwszy łatwiej w Silverlight niż w WPF. :) Drugim punktem linku 5 jest odpowiedź !!! Pracował dla mnie. Wielkie dzięki – Houman

0

Dołącz do zmienionego wydarzenia ObservableCollection.

Przypisany do DataTable i użyłem zdarzenia RowChanged.

+0

Nie działa przy zmianie jednej właściwości przedmiotu w kolekcji. –

7

Od http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c38fc695-d1ec-4252-87b7-feb484ee01e4/, zmień parametr UpdateSourceTrigger powiązania na PropertyChanged. Właściwość zostanie zaktualizowana natychmiast, przed zdarzeniem RowEditEnding, a nowa wartość będzie dostępna za pośrednictwem modułu obsługi zdarzeń RowEditEnding.

Na przykład dla DataGridComboBoxColumn

SelectedItemBinding="{Binding ForTestResult, UpdateSourceTrigger=PropertyChanged}" 

Wydaje się to bardzo prosty sposób na rozwiązanie tego problemu.

Ponadto, chociaż nie próbowałem go, myślę, że powinno być łatwo uzyskać dostęp do oryginalnej wartości przed edycją, jeśli obiekt implementuje IEditableObject.

+1

Dzięki, to powinna być odpowiedź! – orangesherbert

+0

Nie działa dla sformatowanych wartości dat, liczb dziesiętnych itp. Tylko dla ciągów. –

+0

Też myślę, że to powinna być odpowiedź, więc przegłosowałem –

1

Rozwiązanie to wydaje się dość proste. Polecono od msdn forum.

private void dgEmployees_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
{   
    Action action = delegate 
        { 
        Employee emp = e.Row.Item as Employee; 
        //do something nice to the employee     
        }; 
    Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.Background); 
} 
0

Moja świeże i IMHO najszybszym sposobem jest dodanie bool rowEdited=false, a następnie ustawić go do true wewnątrz DataGrid_RowEditEnding i umieścić swój kod dla 'editEnded' wewnątrz DataGrid_LayoutUpdated:

if (rowEdited) 
{ 
    //main code here// 
    rowEdited=false; 
} 

.

Powiązane problemy