显示具有动态列和单元格背景的网格

时间:2013-12-12 12:52:04

标签: c# wpf wpf-controls wpfdatagrid

我尝试了很多选项,但似乎没有一个适合我。这是问题所在:

动态列。我得到了一个词典列表。所有词典可能有不同的键。 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颜色的绑定创建自定义单元格模板。但是,然后在每个模板中我必须指定绑定。所以模板的数量会很大。 有没有办法实现我需要的东西,而不为每列生成模板?

我个人希望避免在代码中生成模板。

2 个答案:

答案 0 :(得分:0)

不确定我完全理解你的问题,但它应该很简单。 DataGrid非常灵活。

据我所知,你几乎拥有它。现在,您需要一个可以从XAML资源获取的全局CellTemplate(因此您不需要将其硬编码到代码中)。

CellTemplate可以根据触发器更改颜色。您可以将其硬编码到XAML中,也可以提供可以从“VALUE”映射到“COLOR”的Dictionary,并将CellTemplate的背景绑定到该词典。

生成动态列时,将DataGridTextColumn.CellTemplate设置为LoadDynamicallyXaml(“yourresource”)。生成列时,您可以访问DataGrid资源,也可以从那里获取CellTemplate,这是更清洁的方式。

Loading XAML at runtime?

答案 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