将 DataGrid 绑定到两个 DataTable

Posted

技术标签:

【中文标题】将 DataGrid 绑定到两个 DataTable【英文标题】:Binding DataGrid to two DataTable 【发布时间】:2015-12-14 08:31:56 【问题描述】:

我有两个 DataTable,它们的结构、架构和约束完全相同,但行不同。

我需要将这些表显示为DataGrid,并连接在一起,即首先是第一个DataTable 的行,然后是第二个的行。

我不想加入、合并或创建新的DataTable 对象的任何操作,因为我需要在DataGrid 中显示两个原始对象的更改(以及另一个方向:如果用户在DataGrid中修改了一些东西,我想更新两个原件DataTable)。

所以我想我需要的是一种“代理”,比如两个DataTable 上的DataView,但我不知道这是否可能。

【问题讨论】:

您仍然需要将它们连接成一个对象(另一个表、视图等),然后将其设置为DataGrid.ItemsSource。关系并不重要。 @Sinatr 但这样对两个原始 DataTable 的更改不会影响 DataGrid,反之亦然。 【参考方案1】:

proxy",就像两个DataTable上的一个DataView,

我建议创建一个矢量类实体,它具有要显示的列的所有属性。但是这个类实体将保留对原始数据的引用。将两个 DataTable 提炼成这个新对象的一个​​列表并绑定到该列表。

要处理更改,请让类遵守INotifyPropertyChange 并创建一个数据管理器,它将订阅每个实例的属性更改。当管理器检测到更改时,它会将更改推送回原始 DataTable 的行。

public class DataVector : INotifyPropertyChange

    public DataTable OriginationDataTable  get; set; 
    public int OrininationRow  get; set; 

    // Mirror the properties
    public string Name  get   _Name = value; NotifyChange("Name"); 


    // CTORs which help create this object
    public DataVector(DataTable dt, int originatingRow)  ...  

   ....

【讨论】:

这可能有效,但如果列名仅在运行时已知,则不适合,除非您使用反射.. 对吗? @WoDoSc 当然必须知道列,但坦率地说,为什么不知道呢?谁在接收来自数据库调用的未知接口?恕我直言,这个场景是一次性的。 实际上在我的情况下,列的数量(和名称)会动态变化,具体取决于我试图处理的“问题实例”。例如,我表的每一列是一家公司,每一行是一个产品(反之亦然),一个单元格包含该产品在该公司的成本(这只是一个例子,我的情况略有不同,但我此处不能提及)。

以上是关于将 DataGrid 绑定到两个 DataTable的主要内容,如果未能解决你的问题,请参考以下文章

Datagrid:计算页脚中列的平均值或总和

将内部datagrid数据与外部datagrid wpf绑定

如何将 DataTable 绑定到 Datagrid

通过 ActionScript 将数据绑定到 DataGrid

找不到将Wpf DataGrid列绑定到属性的方法[关闭]

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?