visual tutorial studio que español ejemplos ejemplo wpf data-binding datagrid

tutorial - wpf visual studio



Cómo actualizar un WPF DataGrid? (7)

El problema es que debe actualizar su DataContext LINQ-to-SQL. 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.

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.

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 está actualizado. 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 tratado de usar "UpdateTarget" en BindingExpression de DataGrid, pero no me ayudó. También probé "dataGrid.Items.Refresh ()" - el mismo resultado. ¿Cómo puedo arreglar esto?


La razón por la que no se está actualizando es que LINQ-to-SQL no implementa INotifyCollectionChanged, por lo que WPF no tiene forma de saber si 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.


Me encontré con el mismo problema y encontré que el 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); } }


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.


Por algún motivo, 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 grilla subyacente a la colección.


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.