检查 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 中

在 CollectionViewSource 上触发过滤器

在datagrid celltemplate中绑定collectionviewsource

在 ViewModel 中使用 CollectionViewSource 的正确方法

当ObservableCollection发生变化时更新CollectionViewSource WP7