背景: Windows.Forms データベース アプリケーション (非常に大きなもので、データ ソース、レンダラーなどにプラグインを使用) があり、WPF レンダラーを追加したいと考えています。関連するコード部分を除外しようとしました。さらにコードが必要な場合は、投稿します。
問題: OLEDB データ ソース プラグインで、 DataView から BindingSource (System.Windows.Forms) を生成します。
BindingSource MySource = new BindingSource { DataSource = MyDataSet.Tables[MyTable].DefaultView };
これを Windows フォーム コントロール (データ ソース プラグインから BindingSource にアクセスできるレンダラー プラグイン内) にバインドできます。
System.Windows.Forms.Binding MyBinding = new System.Windows.Forms.Binding(MyProperty, MyBindingSource, MyField);
MyControl.DataBindings.Add(MyBinding);
MyBindingSourceの Position が変更されると、Control が更新されます。
ここで、同じ BindingSource を使用して WPF コントロール (別のレンダラー プラグイン内) を更新したいと考えています。
System.Windows.Data.Binding MyWPFBinding = new System.Windows.Data.Binding(MyField);
MyWPFBinding.Source = MyBindingSource;
MyWPFBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
MyWPFControl.SetBinding(ContentControl.ContentProperty, MyWPFBinding);
1回で動作します。MyBindingSourceの位置がどのように変化しても、常に DataView の最初の行から値をバインドします。
私の解決策(さらに6時間回答として投稿できません)
まず、HighCore のおかげで、BindingSource を OLEDB プラグインから、それが属する WinForms レンダラー プラグインに移動しました。これにより、プログラムで同じ DataTable の複数のビューを作成することもできました!
そして、WPFの場合、これを行いました。
WPF レンダラーをセットアップします。
CollectionViewSource MySource;
DataTable MyTable;
DataView MyView;
MyTable = *get table from OLEDB Plugin*;
MyView = MyTable.DefaultView;
MyView.Sort = *get table key from OLEDB Plugin* + " ASC";
ViewSource = new CollectionViewSource { Source = MyView };
ViewSource.MoveCurrentToFirst();
WPF バインディングをセットアップします。
MyBinding = new Binding(MyField);
MyBinding.Source = ViewSource.View;
MyBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
MyControl.SetBinding(ContentControl.ContentProperty, MyBinding);
メイン アプリケーションからの変更イベント (すべてのレンダラーでデータセットを選択するために行概要プラグインから間接的に起動されます):
DataRowView[] row = MyView.FindRows(CurrentIndex);
ViewSource.View.MoveCurrentTo(row[0]);
すべてのレンダラーに常に同じ並べ替えを使用し、一意のキーを使用するようにしたので、検索時に常に1行しか見つかりません。