我尝试了很多选项,但似乎没有一个适合我 . 这是问题所在:
动态列 . 我得到了一个词典列表 . 所有词典可能有不同的键 . 例如 .
[ [key1: 111], [key2: 222] ]
[ [key1: 333], [key4: 444] ]
[ [key5: 777] ]
我需要显示一个网格,所有键都是这样的列:
[key1] [key2] [key4] [key5]
111 222
333 444
777
这很简单,我只是在GridView或DataGrid的代码中生成列 .
但还有第二个要求:
我需要根据其中的值对特定单元格进行着色 . 例如 . 对于111 bg颜色应为绿色,对于333应为红色等 .
目前我只能做一部分工作 . 我可以动态创建列,但是我无法为它们着色 . 或者我可以创建静态列并使用bg颜色的绑定创建自定义单元格模板 . 但是,然后在每个模板中我必须指定绑定 . 所以模板的数量会很大 . 有没有办法实现我需要的东西,而不为每列生成模板?
我个人想避免在代码中生成模板 .
2 回答
我不确定我完全理解你的问题,但它应该很简单 . DataGrid非常灵活 .
据我所知,你几乎拥有它 . 现在您需要一个可以从XAML资源获取的全局CellTemplate(因此您不需要将其硬编码到代码中) .
CellTemplate可以根据触发器更改颜色 . 您可以将其硬编码到XAML中,也可以提供可以从“VALUE”映射到“COLOR”的Dictionary,并将CellTemplate的背景绑定到该词典 .
生成动态列时,将
DataGridTextColumn.CellTemplate
设置为LoadDynamicallyXaml("yourresource") . 生成列时,您可以访问DataGrid资源,也可以从那里获取CellTemplate,这是更清洁的方式 .Loading XAML at runtime?
您可以为包含
DataTriggers
的TextBlock
定义Style
,然后将Style
应用于动态创建的列中的TextBlock
...此方法应该适用于代码变得太长之前最多约8个不同的值/颜色对:您可以使用的另一种方法是将
Converter
类与Binding
一起使用 . 您可以在许多在线帖子中找到这样做的详细示例......以下是一些:How to set Foreground of DataGrid Column with ValueConverter
Datagrid AutoGenerateColumns="True" forecolor IValueConverter