背景:我有一个 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的位置发生变化时,控件会更新。
现在我想使用相同的 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);
它工作一次。无论MyBindingSource的位置如何变化,它总是绑定 DataView 中第一行的值。
我的解决方案(不能再发布 6 小时作为答案)
首先,感谢 HighCore,我还将 BindingSource 从我的 OLEDB 插件移到了它所属的 WinForms Renderer 插件。这也使我的程序能够创建同一个 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]);
我只是确保始终对所有渲染器使用相同的排序并使用唯一键,因此我在搜索时总是只找到一行。