添加新行后为什么我的绑定控件不更新?
我正在使用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接口更新绑定控件,以避免需要刷新。