我正在使用wpf拖放数据绑定到数据集。我使用BindingListCollectionView的AddNew方法生成一个新的数据表行。我在新行上设置值,并在BindingListCollectionView上调用CommitNew。 我希望在绑定控件中看到我指定的值,但它们都是空白的。如果我将更改保存到数据库,则控件会更新,但我希望用户在调用之前查看我指定的值TableAdapterManager上的UpdateAll。
背景:
我在与wpf应用程序分开的项目中创建了一个强类型数据集。我的wpf应用程序引用了数据集应用程序。我在wpf app中添加了一个指向类型化数据集的对象数据源。我将字段/控件从数据源窗口拖到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()
答案 0 :(得分:0)
简单的解决方法是在调用CommitNew后调用BindingListCollectionView 的Refresh方法。
_blcvScanData.Refresh()
我通过intellisense偶然发现了我对自己问题的回答。如果有人能解释为什么刷新是必要的,我会很感激。我期望INotifyPropertyChange接口更新绑定控件,无需调用刷新。