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?
由于DataGridRow
的DataContext
始终是IEnumerable<T>
序列中DataGrid
的ItemsSource
属性设置或绑定到的T
类型的当前项,因此您必须在CellTemplate
和CellEditingTemplate
的绑定路径中包含单元格的索引,例如:
Binding="Binding Values[0].CalculatedValue"
...第一列。
这意味着您必须(最好以编程方式)为每一列创建一个单独的模板,在其中将绑定路径中的 [0]
替换为该列单元格的索引。
【讨论】:
以上是关于WPF DataGrid 将单元格绑定到具有动态列的数据模型的主要内容,如果未能解决你的问题,请参考以下文章
c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?
C# wpf datagrid 动态加载数据后改变单元格颜色bug