0

データセットへのwpfドラッグアンドドロップデータバインディングを使用しています。BindingListCollectionView の AddNew メソッドを使用して、新しいデータ テーブル行を生成します。新しい行に値を設定し、BindingListCollectionView で CommitNew を呼び出します。バインドされたコントロールに割り当てられた値が表示されることを期待していますが、それらはすべて空白です。変更をデータベースに保存すると、コントロールが更新されますが、TableAdapterManager で UpdateAll を呼び出す前に、ユーザーが割り当てられた値を確認できるようにします。

背景:
wpf アプリケーションとは別のプロジェクトで、厳密に型指定されたデータセットを作成しました。私の wpf アプリはデータセット アプリケーションを参照します。型指定されたデータセットを指すオブジェクト データソースを wpf アプリに追加しました。フィールド/コントロールをデータソース ウィンドウから wpf デザイナー ウィンドウにドラッグしました。生成された xaml には、CollectionViewSource がデータセットとデータテーブルに正確にバインドされた Window.Resources セクションが含まれています。この CollectionViewSource は、デザイン サーフェイスにドラッグしたコントロールの DataContext です。すべてのコントロールは、TwoWay データバインディングを使用します。

ウィンドウが読み込まれると、(FindResource を使用して) xaml の CollectionViewSource への参照を取得します。次に、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()
4

1 に答える 1

0

簡単な修正は、CommitNew を呼び出した後に BindingListCollectionView の Refresh メソッドを呼び出すことです。

_blcvScanData.Refresh()

インテリセンスを介して、自分の質問に対するこの回答に出くわしました。リフレッシュが必要な理由を誰かが説明できれば、ありがたいです。INotifyPropertyChange インターフェイスがバインドされたコントロールを更新し、refresh を呼び出す必要がなくなることを期待していました。

于 2010-08-31T19:19:01.583 に答える