Проверьте, является ли строка новой в CollectionViewSource

У меня есть CollectionViewSource (cvs), который строго типизировал DataTable в качестве источника. Cvs.View установлен как источник данных DataGrid. Я хочу обновить, вставить и удалить данные из базы данных на основе изменений в DataGrid. Я успешно сделал обновление, и у меня есть идея для удаления, но для вставки у меня есть некоторые проблемы. Я пытался сделать это, обрабатывая событие CurrentChanging cvs.View, но состояние строки всегда отключено, и это должно быть добавлено. Вот мой код:

private void View_CurrentChanging(object sender, CurrentChangingEventArgs e)
{
    if (cvs.View.CurrentItem != null)
    {
        var dataRow = ((cvs.View.CurrentItem as DataRowView).Row) as MyDataSet.MyTableRow;
        if (dataRow.HasChanges())
        {
            //do update - works
        }
        dataRow.EndEdit(); // without this line RowState is Unchanged when it should be Added
        if (dataRow.RowState == DataRowState.Added)
        {
            //do insert - never goes here, RowState is Detached when it should be Added
        }
    }
}

Это правильный способ сделать это? Я что-то пропустил? Заранее спасибо.

РЕДАКТИРОВАТЬ: привязка DataGrid:

dataGrid1.ItemsSource = cvs.View;

3 ответа

Решение

Я использую это в моем приложении wpf:

this.MyView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.MyDataTable);

если вы делаете вставку, обновляете или удаляете в свою таблицу данных, то она автоматически отражается в вашем представлении / таблице данных.

РЕДАКТИРОВАТЬ: MyView - это представление, которое вы привязываете к вашей DataGrid в вашем пользовательском интерфейсе

private BindingListCollectionView _view;

public BindingListCollectionView MyView 
{
    get { return this._view; }
    protected set
    {
        this._view = value;
        this.NotifyPropertyChanged(() => this.MyView);
    }
}

XAML

<DataGrid ItemsSource="{Binding Path=MyView, Mode=OneWay, ValidatesOnDataErrors=true, ValidatesOnExceptions=true}" />

Это старый пост, но у меня есть другое решение:

RowState="{Binding CurrentItem.Row.RowState}"

RowState - это свойство зависимости в моем элементе управления с типом DataRowState.

Также необходимо правильно инициализировать новую строку! Для меня работает (и я думаю, что для других также):

DataRowView rv = dv.AddNew();
rv.EndEdit();

Надеюсь, это кому-нибудь поможет!

Я столкнулся с тем же странным поведением. Если datarow отсоединен и вы получаете строку из BindingSource.Item (т.е. datarowview), то вызов EndEdit для строки не добавляет строку в таблицу. Так что как обходной путь.

Вместо вызова DataRow.EndEdit сначала проверьте RowState строки данных, если она отсоединена, а затем вручную добавьте ее в таблицу, т.е.

If Row.RowState=DataRowState.Detached Then
  Row.Table.Rows.Add(Row)
Else
  Row.EndEdit
End If
Другие вопросы по тегам