2009-05-30 17 views
21

Tengo un WGD DataGrid con algunos datos. Puede agregar filas a través de una ventana separada. El DataContext es el mismo, un objeto LINQ-to-SQL. La vinculación también es la misma, yo ato la propiedad "ItemsSource" a una tabla.Cómo actualizar un WGD DataGrid?

En la otra ventana, cuando el usuario hace clic en "Guardar", creo una fila programáticamente y la agrego usando "InsertOnSubmit". Después de eso utilizo el método "SubmitChanges" de DataContext.

Mi problema es que DataGrid no se actualiza. Si reinicio la aplicación, puedo ver la nueva fila, por lo que está en la base de datos, pero no pude encontrar una manera de actualizar DataGrid.

Hasta ahora he intentado usar "UpdateTarget" en BindingExpression de DataGrid, pero no sirvió de nada. También probé "dataGrid.Items.Refresh()" - el mismo resultado. ¿Cómo puedo arreglar esto?

Respuesta

20

La razón por la que no se actualiza es que LINQ-to-SQL no implementa INotifyCollectionChanged, por lo que WPF no tiene forma de decir que se ha actualizado ItemsSource. La forma menos aterradora de arreglar esto, es copiar los resultados de LINQ-to-SQL en un ObservableCollection; cuando lo haga, también agregue a la colección observable. Entonces verás la actualización.

+0

Su solución obviamente está funcionando. Solo pensé que podría salirme con el simple marcado de enlace XAML. – KovBal

+0

Si usamos un ObservableCollection para ser un puente entre linq a sql y el control, ¿cómo podemos usar SubmitChanges() para publicar el resultado de nuevo en la base de datos? – MemoryLeak

+3

@MemoryLeak - así que aquí está el truco; no solo desea saber cuándo cambia la * colección * (es decir, qué INotifyCollectionChanged), sino también cuándo cambia alguno de los * elementos *. Por lo tanto, debe suscribirse al cambio de colección, luego agregar/eliminar, suscribirse a INotifyPropertyChanged de cada elemento. * Luego * tiene que decidir qué guardar según las notificaciones que reciba –

2

El problema es que debe actualizar su LINQ-to-SQL DataContext. El DataContext no reconocerá correctamente la nueva fila incluso después de que un envío cambie. Debe disponer del DataContext que tiene y crear uno nuevo. En la mayoría de los casos, DataContext se debe usar para una operación corta y no como un objeto de larga duración.

+0

Su solución es muy similar a la de Pwninstein. Lamentablemente, el resultado es el mismo, ya que el evento DataContextChanged no hace que DataGrid se actualice. – KovBal

0

O simplemente invoque el código de búsqueda nuevamente (generalmente el botón de búsqueda)> Lo he resuelto en mi caso de esta manera.

1

Si tiene un caso en el que tiene que volver a cargar una cuadrícula en otra ventana, simplemente puede cerrar esa ventana e invocarla nuevamente.

56
+0

Gracias :) Intenté volver a enlazar la misma fuente, pero no actualizó los datos.Estableciendo ItemsSource = null y luego la fuente correcta hizo una actualización pero provocó que se disparara SelectionChanged. ¡Items.Refresh() funcionó perfecto! – Gertjan

+0

¡Esto funciona perfectamente! –

+0

Funciona a la perfección. gracias :) –

4

me encontré con el mismo problema y encontró que mejor lugar para ObservableCollection es DataContext. Tiene algunos métodos parciales generados por el diseñador que se pueden usar para actualizar la colección. Este código funciona bastante bien:

partial class DataClassesDataContext 
{ 
    private ObservableCollection<Task> taskCollection; 
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; } 

    partial void OnCreated() 
    { 
     taskCollection = new ObservableCollection<Task>(Tasks); 
     TaskView = new ReadOnlyObservableCollection<Task>(taskCollection); 
    } 

    partial void InsertTask(Task instance) 
    { 
     taskCollection.Add(instance); 
     this.ExecuteDynamicInsert(instance); 
    } 

    partial void DeleteTask(Task instance) 
    { 
     taskCollection.Remove(instance); 
     this.ExecuteDynamicDelete(instance); 
    } 
} 
0

Por alguna razón Items.Refresh() no funciona para mí. Lo que funcionó fue hacer que mi colección subyacente heredara ObservableCollection y luego llame a su método Add.

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o)); 

ContactUIObjects es solo la colección de grillas subyacentes.

Cuestiones relacionadas