Проверьте, является ли строка новой в 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