首页 文章

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

提问于
浏览
0

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

动态列 . 我得到了一个词典列表 . 所有词典可能有不同的键 . 例如 .

[ [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

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

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

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

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

    Loading XAML at runtime?

  • 0

    您可以为包含 DataTriggersTextBlock 定义 Style ,然后将 Style 应用于动态创建的列中的 TextBlock ...此方法应该适用于代码变得太长之前最多约8个不同的值/颜色对:

    <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 类与 Binding 一起使用 . 您可以在许多在线帖子中找到这样做的详细示例......以下是一些:

    How to set Foreground of DataGrid Column with ValueConverter
    Datagrid AutoGenerateColumns="True" forecolor IValueConverter

相关问题