Подтвердить что ты не робот

WPF Datagrid Row Редактирование события "ENDED"

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

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

В любом случае, я могу поднять событие RowEditEnded?

Спасибо...

4b9b3361

Ответ 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
            }
        }
    }