添加新行后为什么我的绑定控件不更新?

添加新行后为什么我的绑定控件不更新?

问题描述:

我正在使用wpf将数据绑定拖放到数据集。我使用BindingListCollectionView的AddNew方法生成一个新的可数据行。我在新行上设置了值,并在BindingListCollectionView上调用CommitNew。 我希望在绑定控件中看到我的指定值,但它们都是空白的。如果我保存对数据库的更改,则控件将更新,但我希望用户在调用TableAdapterManager上的UpdateAll之前查看分配的值。添加新行后为什么我的绑定控件不更新?

背景:
我在与wpf应用程序分开的项目中创建了强类型数据集。我的wpf应用程序引用数据集应用程序。我在wpf应用程序中添加了一个指向类型数据集的对象数据源。我将字段/控件从数据源窗口拖到wpf设计器窗口。生成的xaml包含一个Window.Resources部分,其中一个CollectionViewSource可以精确地绑定到我的数据集和数据表。这个CollectionViewSource是我拖入设计界面的控件的DataContext。所有的控件都使用TwoWay数据绑定。

当窗口加载时,我抓取对xaml的CollectionViewSource(使用FindResource)的引用。然后我抓取对CollectionViewSource的视图属性的引用,并将其转换为BindingListCollectionView。现在我使用BindingListCollectionView的AddNew方法生成一个新行(AddNew作为对象返回)。我将对象转换为DataRowView并访问它的Row属性。然后,我将该行转换为强类型的数据表行(由DataSet设计器生成)。现在我将值分配给一些数据表行列。我在BindingListCollectionView上调用CommitNew。最后我在CollectionViewSource上调用MoveCurrentToFirst。

问题:
使用监视表达式我可以看到数据位于CollectionView和BindingListCollectionView的SourceCollection中。 任何人都可以解释为什么绑定控件不显示数据,除非我将更改保存到数据库?

代码(产生XAML未示出):

Private WithEvents _cvsScanData As System.Windows.Data.CollectionViewSource 
Private WithEvents _blcvScanData As System.Windows.Data.BindingListCollectionView 

_cvsScanData = CType(Me.FindResource("Dt_tblScanDataViewSource"), System.Windows.Data.CollectionViewSource) 

_blcvScanData = CType(_cvsScanData.View, BindingListCollectionView) 

Dim newRow As LabDataSet.dt_tblScanDataRow = CType(CType(_blcvScanData.AddNew, System.Data.DataRowView).Row, LabDataSet.dt_tblScanDataRow) 

newRow.SampleID = "testSampleID" 
newRow.MachineID = "testMachineID" 

_blcvScanData.CommitNew() 

_cvsScanData.View.MoveCurrentToFirst() 

的简单的解决方法是呼叫BindingListCollectionView的调用CommitNew后刷新方法。

_blcvScanData.Refresh() 

我偶然发现了这个答案,通过intellisense我自己的问题。如果任何人都可以解释为什么刷新是必要的,我会很感激。我期望INotifyPropertyChange接口更新绑定控件,以避免需要刷新。