WPF Datagrid Row Редактирование события "ENDED"
Я знаю, что WPF datagrid имеет событие "RowEditEnding", но мне нужно запустить событие после того, как строка предложит проверить, дублируется ли вновь добавленная строка и объединить дублируемую строку. У моего datagrid свойство CanUserAddRow установлено значение True.
Я использую EntityObservableCollection, который расширяет ObservableCollection для синхронизации моего объекта с коллекцией. Итак, я рассмотрел событие OnCollectionChanged, но событие "InsertItem" повышается после того, как пользователь нажимает на строку владельца нового элемента, что означает, что объект все еще пуст, и я не могу проверить наличие дубликата.
В любом случае, я могу поднять событие RowEditEnded?
Спасибо...
Ответы
Ответ 1
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
}
Ответ 2
Я нашел ответ на ваш вопрос usingVS2010
, если (e.EditAction == DataGridEditAction.Commit) в RowEditEnding выполнит требование ur
Пожалуйста, ознакомьтесь с приведенным ниже кодом.
private void dataGrid1_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
if (e.EditAction == DataGridEditAction.Commit)
{
MessageBox.Show("asd");
}
}
Это Xaml Behind.
<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>
Ответ 3
Попробуйте установить функцию CommitEdit() для вашего datagrid. Я использовал его здесь:
private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
this.MyDataGrid.CommitEdit(DataGridEditingUnit.Row, false);
}
Ответ 4
Интересно, почему вы находите способ поднять событие RowEditEnded;
если выполнить событие RowEditEnding datagrid; всякий раз, когда вы редактируете строку и меняете фокус с этой строки, строка будет зафиксирована, и RowEditEnding будет поднят;
поэтому после того, как Row установил RowEditEnding, он будет создан и работает так же, как RowEditEnded;
Я понял что-то не так из вашего текста?
Ответ 5
Решение VB.NET для решения @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
Ответ 6
Принимая ответ от @MaherBenIssa, я использовал это, чтобы избежать добавления и удаления делегата:
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
}
}
}