Проверьте, является ли строка новой в CollectionViewSource - PullRequest
0 голосов
/ 13 июля 2011

У меня есть 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 ]

1 голос
/ 13 июля 2011

Я использую следующее в моем wpf-приложении:

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

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

РЕДАКТИРОВАТЬ: 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}" />
0 голосов
/ 09 октября 2013

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

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

If Row.RowState=DataRowState.Detached Then
  Row.Table.Rows.Add(Row)
Else
  Row.EndEdit
End If
0 голосов
/ 04 января 2013

Это более старая статья, но у меня есть другое решение:

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

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

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

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

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

...