WPF Datagrid Row Редактирование события «ENDED» - PullRequest
26 голосов
/ 15 октября 2010

Я знаю, что в сетке данных WPF есть событие "RowEditEnding", но мне нужно запустить событие после того, как строка попыталась проверить, дублирована ли вновь добавленная строка, и объединить дублированную строку.В моей сетке данных свойство CanUserAddRow установлено в True.

Я использую EntityObservableCollection, которая расширяет ObservableCollection для синхронизации моей сущности с коллекцией.Итак, я рассмотрел событие OnCollectionChanged, но событие «InsertItem» возникает, когда пользователь нажимает на новую строку заполнителя элемента, что означает, что объект все еще пуст, и я не могу проверить наличие дубликатов.Я могу вызвать событие RowEditEnded?

Спасибо ...

Ответы [ 7 ]

25 голосов
/ 15 декабря 2013
    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 голосов
/ 26 сентября 2013

Я нашел ответ на ваш вопрос, используя VS2010

условие, если (e.EditAction == DataGridEditAction.Commit) в RowEditEnding выполнит ваше требование

код ниже.

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

Это Xaml позади.

<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>
1 голос
/ 30 ноября 2017

Исходя из ответа @ 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
            }
        }
    }
0 голосов
/ 20 апреля 2018

Вы можете использовать UpdateSourceTrigger=PropertyChanged для привязки члена свойства для сетки данных.Это гарантирует, что при срабатывании CellEditEnding обновление уже будет отражено в наблюдаемой коллекции.см. этот пост https://stackoverflow.com/a/27239243/9285072

0 голосов
/ 22 августа 2017

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
0 голосов
/ 07 августа 2013

Интересно, почему вы находите способ вызвать событие RowEditEnded;если вы реализуете событие RowEditEnding из datagrid;всякий раз, когда вы редактировали строку и изменяли фокус с этой строки, строка будет зафиксирована, и RowEditEnding будет повышен;

, поэтому после подтверждения строки RowEditEnding будет повышен и будет работать так же, как RowEditEnded;

Я что-то не так понял из твоего текста?

0 голосов
/ 21 марта 2011

Попробуйте установить функцию CommitEdit () для вашей таблицы данных.Я использовал это здесь:

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