代码之家  ›  专栏  ›  技术社区  ›  DeveloperDan Asaf

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

  •  0
  • DeveloperDan Asaf  · 技术社区  · 14 年前

    我正在使用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属性。然后,我将该行强制转换为强类型数据表行(由数据集设计器生成)。现在我将值赋给一些数据表行列。我在bindingListCollectionView上调用commitnew。最后,我在CollectionViewSource上调用MoveCurrentToFirst。

    问题:
    使用watch表达式,我可以看到数据在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()
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   DeveloperDan Asaf    14 年前

    简单的解决方法是 调用bindingListCollectionView的刷新方法 打电话给Commitnew后。

    _blcvScanData.Refresh()
    

    我通过智能感知偶然发现了我自己问题的答案。如果有人能解释为什么需要刷新,我会很感激。我希望使用inotifyPropertyChange接口更新绑定控件,从而避免调用refresh。