2010-10-11 14 views
9

He vinculado un ObservableCollection a un DataGrid. Cuando cambio valores en DataGrid, se genera el evento RowEditEnding. Pero e.Row.Item es el objeto antes de la edición, por lo que no verá los nuevos valores. Lo entiendo por el EditEnding. En Silverlight tiene un evento EditEnded, ¿cómo puedo obtener el objeto con los nuevos valores cuando edito DataGrid?WPF DataGrid tiene RowEditEnding pero no RowEditEnded

gracias,

Filip

Respuesta

6

Bueno, tal vez esto puede ayudar: 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

O esto, ver punto número 5.

Vas a tener que retocar con eso para obtener lo que quieres, pero creo que eso ayuda. O te apunta en una buena dirección.

+4

No puedo creer que MS todavía no haya implementado un evento tan básico. Para la primera vez es más fácil en Silverlight que en WPF. :) ¡El segundo punto de enlace 5 es la respuesta! Trabajó para mi. Muchas gracias – Houman

0

Se conecta al evento cambiado de ObservableCollection.

I atado a una DataTable y utilicé el evento RowChanged.

+0

No funciona al cambiar una propiedad de un elemento en la colección. –

7

De http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c38fc695-d1ec-4252-87b7-feb484ee01e4/, cambie UpdateSourceTrigger de la vinculación a PropertyChanged. La propiedad se actualizará inmediatamente, antes del evento RowEditEnding, y se podrá acceder al nuevo valor desde el manejador de eventos RowEditEnding.

Por ejemplo, para un DataGridComboBoxColumn

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

Esto parece una forma muy simple de resolver este problema.

Además, aunque no lo he probado, creo que debería ser fácil acceder también al valor original antes de editar si su objeto implementa IEditableObject.

+1

¡Gracias, esta debería ser la respuesta! – orangesherbert

+0

No funcionará para valores de formato fechas, decimales, etc. Solo para cadenas. –

+0

También creo que esta debería ser la respuesta, así que voté –

1

Esta solución parece bastante simple. Referido de 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

Mi manera fresca y en mi humilde opinión más rápida es añadir bool rowEdited=false, a continuación, ponerlo en el interior trueDataGrid_RowEditEnding y poner su código para 'editEnded' dentro DataGrid_LayoutUpdated:

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

.