将 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 wpf绑定