检查row是否在CollectionViewSource中是新的



我有一个CollectionViewSource (cvs),它有强类型的数据表作为它的源。Cvs。视图被设置为DataGrid的ItemsSource。我想更新,插入和删除数据从数据库基于在DataGrid的变化。我已经成功地完成了更新,我有一个删除的想法,但对于插入,我有一些问题。我试图通过处理cvs的CurrentChanging事件来做到这一点。视图,但行状态始终是Detached,它应该是Added。下面是我的代码:

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 binding:

dataGrid1.ItemsSource = cvs.View;

我在我的WPF应用程序中使用如下:

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

只要你做一个插入,更新或删除你的数据表,它会自动反映在你的视图/数据网格。

编辑:MyView是你绑定到你的数据网格在你的UI视图

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();

希望这能帮助到一些人!

我遇到了同样奇怪的行为。如果一个数据row被分离并且你从BindingSource获得行。Item(即datarowview),然后对行调用EndEdit不会将行添加到表中。作为变通办法。

而不是调用DataRow。EndEdit首先检查数据行的RowState,如果已分离,则手动将其添加到表中,即:-

If Row.RowState=DataRowState.Detached Then
  Row.Table.Rows.Add(Row)
Else
  Row.EndEdit
End If

最新更新