我正在使用 wpf 拖放数据绑定到数据集。我使用 BindingListCollectionView 的 AddNew 方法生成了一个新的数据表行。我在新行上设置值并在 BindingListCollectionView 上调用 CommitNew。我希望在绑定控件中看到我分配的值,但它们都是空白的。如果我将更改保存到数据库,则控件会被更新,但我希望用户在调用 TableAdapterManager 上的 UpdateAll 之前查看我分配的值。
背景:
我在与我的 wpf 应用程序分开的项目中创建了一个强类型数据集。我的 wpf 应用程序引用了数据集应用程序。我在 wpf 应用程序中添加了一个指向类型化数据集的对象数据源。我将字段/控件从数据源窗口拖到 wpf 设计器窗口。生成的 xaml 包含一个 Window.Resources 部分,其中 CollectionViewSource 准确绑定到我的数据集和数据表。这个 CollectionViewSource 是我拖到设计图面的控件的 DataContext。所有控件都使用 TwoWay 数据绑定。
当窗口加载时,我获取对 xaml 的 CollectionViewSource 的引用(使用 FindResource)。然后我获取对 CollectionViewSource 的 view 属性的引用并将其转换为 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()