检查 CollectionViewSource 中的行是不是是新行
Posted
技术标签:
【中文标题】检查 CollectionViewSource 中的行是不是是新行【英文标题】:Check if row is new in CollectionViewSource检查 CollectionViewSource 中的行是否是新行 【发布时间】:2011-07-13 06:28:15 【问题描述】:我有一个 CollectionViewSource (cvs),它的源是强类型 DataTable。 Cvs.View 设置为 DataGrid 的 ItemsSource。我想根据 DataGrid 中的更改更新、插入和删除数据库中的数据。我已经成功完成更新,并且我有删除的想法,但是对于插入我有一些问题。我试图通过处理 cvs.View 的 CurrentChanging 事件来做到这一点,但行状态始终是分离的,应该添加它。这是我的代码:
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;
【问题讨论】:
请不要将 CollectionViewSource 内容从您的代码中删除,然后尝试将 itemssource 直接设置为您的 DataTable。 【参考方案1】:我在我的 wpf 应用程序中使用以下内容:
this.MyView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.MyDataTable);
只要您对 DataTable 执行插入、更新或删除操作,它就会自动反映在您的视图/数据网格中。
编辑:MyView 是您在 UI 中绑定到 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" />
【讨论】:
我不明白这是什么。我的视图在这里。 查看我的编辑。你不需要监听视图的变化事件。 我理解了大部分内容,但我在 this.NotifyPropertyChanged(() => this.MyView); - MainWindow 不包含 NotifyProperyChanged 的定义 请给我解释一下。我被困住了。我知道如何在表单中做同样的事情,但在 wpf 中却不知道,这太令人困惑了。 this.NotifyPropertyChanged(() => this.MyView);只是 INotifyPropertyChanged 的实现。如果您只设置 itemssource 一次,则可以保留此设置。请发布您的数据网格绑定(xaml 或代码)【参考方案2】:这是一篇较旧的帖子,但我认为还有另一个解决方案:
RowState="Binding CurrentItem.Row.RowState"
RowState 是我的控件中的一个依赖属性,类型为 DataRowState。
还需要正确初始化新行!对我有用(我也认为对其他人有用):
DataRowView rv = dv.AddNew();
rv.EndEdit();
希望这对某人有所帮助!
【讨论】:
【参考方案3】:我遇到了同样的奇怪行为。如果数据行已分离并且您从 BindingSource.Item(即 datarowview)获取该行,则对该行调用 EndEdit 不会将该行添加到表中。所以作为一种解决方法。
首先检查数据行的RowState,而不是调用DataRow.EndEdit,如果分离则手动将其添加到表中,即:-
If Row.RowState=DataRowState.Detached Then
Row.Table.Rows.Add(Row)
Else
Row.EndEdit
End If
【讨论】:
以上是关于检查 CollectionViewSource 中的行是不是是新行的主要内容,如果未能解决你的问题,请参考以下文章
[Wpf]在C#中添加 collectionViewSource
与 CollectionViewSource 绑定时,DesignTime 数据未显示在 Blend 中
在datagrid celltemplate中绑定collectionviewsource