2010-08-31 4 views
0

J'utilise wpf glisser-déposer la liaison de données aux jeux de données. Je génère une nouvelle ligne datatable en utilisant la méthode AddNew de BindingListCollectionView. Je définis des valeurs sur la nouvelle ligne et appelez CommitNew sur BindingListCollectionView. Je m'attends à voir mes valeurs assignées dans les contrôles liés, mais ils sont tous vides. Si vous enregistrez les modifications apportées à la base de données, les contrôles sont ensuite mis à jour, mais je souhaite que l'utilisateur affiche les valeurs que j'ai attribuées avant d'appeler UpdateAll sur TableAdapterManager.Après avoir ajouté une nouvelle ligne, pourquoi mes commandes liées ne sont-elles pas mises à jour?

Arrière-plan:
J'ai créé un ensemble de données fortement typé dans un projet distinct de mon application wpf. Mon application wpf fait référence à l'application de jeu de données. J'ai ajouté une source de données d'objet dans l'application wpf pointant vers l'ensemble de données typé. J'ai fait glisser les champs/contrôles de la fenêtre datasources vers la fenêtre du concepteur wpf. Le xaml généré inclut une section Window.Resources avec une CollectionViewSource liée avec précision à mon dataset et datatable. Cette CollectionViewSource est le DataContext pour les contrôles que j'ai déplacés vers la surface de conception. Toutes les commandes utilisent la liaison de données TwoWay.

Lorsque la fenêtre se charge, j'obtiens une référence à CollectionViewSource de xaml (en utilisant FindResource). Ensuite, j'attrape une référence à la propriété view de CollectionViewSource et la transtype en BindingListCollectionView. Maintenant, j'utilise la méthode AddNew de BindingListCollectionView pour générer une nouvelle ligne (que AddNew renvoie en tant qu'objet). Je lance l'objet à DataRowView et j'accède à sa propriété Row. J'ai ensuite cast la ligne à une ligne datatable fortement typée (générée par le concepteur DataSet). Maintenant, j'affecte des valeurs à certaines des colonnes de lignes datatable. J'appelle CommitNew sur BindingListCollectionView. Enfin, j'appelle MoveCurrentToFirst sur CollectionViewSource.

Problème:
En utilisant une expression montre que je peux voir les données sont dans le SourceCollection à la fois du CollectionView et BindingListCollectionView. Quelqu'un peut-il expliquer pourquoi les contrôles liés n'affichent pas les données à moins d'enregistrer les modifications dans la base de données?

code (généré XAML non représenté):

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() 

Répondre

0

La solution simple est de appel à la méthode de l'actualisation BindingListCollectionView après avoir appelé CommitNew.

_blcvScanData.Refresh() 

Je suis tombé sur cette réponse à ma propre question via intellisense. Si quelqu'un peut expliquer pourquoi rafraîchir est nécessaire, je l'apprécierais. Je m'attendais à ce que l'interface INotifyPropertyChange mette à jour les contrôles liés pour éviter d'avoir à rafraîchir l'appel.

Questions connexes