1

背景:我有一个 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]);

我只是确保始终对所有渲染器使用相同的排序并使用唯一键,因此我在搜索时总是只找到一行。

4

0 回答 0