WPF DataGrid 将单元格绑定到具有动态列的数据模型

Posted

技术标签:

【中文标题】WPF DataGrid 将单元格绑定到具有动态列的数据模型【英文标题】:WPF DataGrid binding cell's to data model with dynamic columns 【发布时间】:2021-12-27 23:14:19 【问题描述】:

我有一个数据模型,可以将其视为具有动态列和行的表。

模型公开了一个定义当前存在的列的集合。 每列本身就是一个对象(模型)。 该模型还公开了一个包含行的集合。此外,每一行都是代表该行的模型。

每一行都公开一个包含列值的集合。每列“值”也是一个模型。

MyModel
    - Columns (list of MyModelColumn)
    - Rows (list of MyModelRow)
    
MyModelColumn
    - Header (string)
    - ...

MyModelRow
    - Values (list of MyModelCell)
    - ...
    
MyModelCell
    - CalculatedValue
    - DisplayValue
    - Color
    - ...

我想要实现的是:

一个动态创建列的DataGrid,对应于MyModel.Columns DataGrid 中的每个单元格都必须能够绑定到相应MyModelCell 的属性。 每个DataGrid 列都是一个DataGridTemplateColumn

这似乎不太难,但我尝试了几种不同的方法,仍然无法完成。

我设法动态地创建了DataGrid 列(来自代码隐藏)。

DataGrid 自身的行为使得DataGridTemplateColumn 中的每个单元格都具有 其DataContext 设置为属于整行的“数据项”。在这种情况下,每个DataGrid 单元格的DataContext 是一个MyModelRow 实例。

DataGrid 单元的DataTemplate 知道MyModelRow,并且可以直接绑定到该类的属性,但这不是我想要的。我想绑定到属于行/列的相应MyModelCell。 从 CellTemplate(和 CellEditingTemplate)中,您永远无法确定单元格位于哪一列,因此您不知道 您必须访问哪个MyModelCell(来自MyModelRow.Values)才能读取MyModelCell 的属性。

主要问题是:如何将DataGrid中的每个单元格连接到它所属的MyModelCell?

我说的数据模型类是viewmodels,问题主要是UI相关的。因此,使用代码隐藏很好,甚至是不可避免的。

【问题讨论】:

【参考方案1】:

主要问题是:如何将DataGrid中的每个单元格连接到它所属的MyModelCell?

由于DataGridRowDataContext 始终是IEnumerable<T> 序列中DataGridItemsSource 属性设置或绑定到的T 类型的当前项,因此您必须在CellTemplateCellEditingTemplate的绑定路径中包含单元格的索引,例如:

Binding="Binding Values[0].CalculatedValue"

...第一列。

这意味着您必须(最好以编程方式)为每一列创建一个单独的模板,在其中将绑定路径中的 [0] 替换为该列单元格的索引。

【讨论】:

以上是关于WPF DataGrid 将单元格绑定到具有动态列的数据模型的主要内容,如果未能解决你的问题,请参考以下文章

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?

WPF DataGrid中一列中的动态单元格控件

C# wpf datagrid 动态加载数据后改变单元格颜色bug

WPF DataGrid 单元格绑定到域对象中属性的属性未更新

突出显示 WPF DataGrid 的已编辑单元格

WPF DataGrid - 如何设置正确的 DataTrigger 绑定到单元格的数据源(而不是行的源)