sirve que para ejemplo wpf wpfdatagrid observablecollection

wpf - ejemplo - para que sirve observablecollection c#



Evento WPF Datagrid Row Editing "ENDED" (7)

Sé que WPF datagrid tiene el evento "RowEditEnding", pero necesito activar el evento después de que Row se haya comprometido a verificar si la fila recién agregada está duplicada y fusionar la fila duplicada. Mi datagrid tiene la propiedad "CanUserAddRow" establecida en True.

Estoy usando EntityObservableCollection que extiende ObservableCollection para sincronizar mi entidad con la colección. Por lo tanto, consideré el evento OnCollectionChanged, pero el evento "InsertItem" se incrementa una vez que el usuario hace clic en la nueva fila del marcador de posición del elemento, lo que significa que el objeto todavía está vacío y no puedo verificar si hay duplicados.

¿Hay alguna forma de que pueda levantar el evento RowEditEnded?

Gracias...


Encontré una respuesta a su pregunta usando SV2010

condición si (e.EditAction == DataGridEditAction.Commit) en el RowEditEnding cumplirá con su requisito

Por favor, consulte el siguiente código.

private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (e.EditAction == DataGridEditAction.Commit) { MessageBox.Show("asd"); } }

Este es el Xaml Detrás.

<DataGrid AutoGenerateColumns="False" CanUserAddRows="True" Height="241" RowEditEnding="dataGrid1_RowEditEnding" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="573" > <DataGrid.Columns> <DataGridTextColumn Header="name" Binding="{Binding id}" Width="300"> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>


Intente configurar la función CommitEdit () para su datagrid. Lo usé aquí:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) { this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false); }


Me pregunto por qué está encontrando la manera de aumentar el evento RowEditEnded; si implementa el evento RowEditEnding de datagrid; siempre que edite una fila y cambie el enfoque de esa fila, la fila se confirmará y RowEditEnding se levantará;

por lo tanto, una vez que Row haya confirmado, RowEditEnding se generará y funcionará como RowEditEnded;

¿Entendí algo mal de tu texto?


Puede usar UpdateSourceTrigger=PropertyChanged en el enlace del miembro de la propiedad para el datagrid. Esto asegurará que cuando se CellEditEnding la actualización ya se haya reflejado en la colección observable. ver esta publicación https://.com/a/27239243/9285072


Solución VB.NET para la solución de @MaherBenIssa

Private Sub dgLayer_RowEditEnding(sender As Object, e As DataGridRowEditEndingEventArgs) Dim d As DataGrid d = DirectCast(sender, DataGrid) RemoveHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding dgLayer.CommitEdit() sender.Items.Refresh() AddHandler d.RowEditEnding, AddressOf dgLayer_RowEditEnding End Sub


Tomando la respuesta de @MaherBenIssa, usé esto para evitar agregar y eliminar delegado:

private bool locker = true; private void dgArticles_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (locker) { try{ locker = false; (sender as DataGrid).CommitEdit(DataGridEditingUnit.Row, false); ((sender as FrameworkElement).DataContext as ViewModel)?.Edit(e.Row.DataContext); } finally{ locker = true; //enable editing again } } }


private void dgrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (this.dgrid.SelectedItem != null) { (sender as DataGrid).RowEditEnding -=dgrid_RowEditEnding; (sender as DataGrid).CommitEdit(); (sender as DataGrid).Items.Refresh(); (sender as DataGrid).RowEditEnding += dgrid_RowEditEnding; } else Return; //then check if the newly added row is duplicated }