我尝试了很多选项,但似乎没有一个适合我。这是问题所在:
动态列。我得到了一个词典列表。所有词典可能有不同的键。 E.g。
[ [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颜色的绑定创建自定义单元格模板。但是,然后在每个模板中我必须指定绑定。所以模板的数量会很大。 有没有办法实现我需要的东西,而不为每列生成模板?
我个人希望避免在代码中生成模板。
答案 0 :(得分:0)
不确定我完全理解你的问题,但它应该很简单。 DataGrid非常灵活。
据我所知,你几乎拥有它。现在,您需要一个可以从XAML资源获取的全局CellTemplate(因此您不需要将其硬编码到代码中)。
CellTemplate可以根据触发器更改颜色。您可以将其硬编码到XAML中,也可以提供可以从“VALUE”映射到“COLOR”的Dictionary,并将CellTemplate的背景绑定到该词典。
生成动态列时,将DataGridTextColumn.CellTemplate
设置为LoadDynamicallyXaml(“yourresource”)。生成列时,您可以访问DataGrid资源,也可以从那里获取CellTemplate,这是更清洁的方式。
答案 1 :(得分:0)
您可以为包含Style
的{{1}}定义TextBlock
,然后将DataTriggers
应用于动态创建的列中的Style
。 ..在代码变得太长之前,这种方法应该适用于大约8种不同的值/颜色对:
TextBlock
您可以使用的另一种方法是将<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="111">
<Setter Property="TextElement.Foreground" Value="LightGreen" />
</DataTrigger>
<DataTrigger Binding="{Binding}" Value="222">
<Setter Property="TextElement.Foreground" Value="LightBlue" />
</DataTrigger>
<DataTrigger Binding="{Binding}" Value="333">
<Setter Property="TextElement.Foreground" Value="LightPink" />
</DataTrigger>
</Style.Triggers>
</Style>
课程与Converter
一起使用。您可以在许多在线帖子中找到这样做的详细示例......以下是一些:
How to set Foreground of DataGrid Column with ValueConverter
Datagrid AutoGenerateColumns="True" forecolor IValueConverter