Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示具有动态列和单元格背景的网格_C#_Wpf_Wpf Controls_Wpfdatagrid - Fatal编程技术网

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

C# 显示具有动态列和单元格背景的网格,c#,wpf,wpf-controls,wpfdatagrid,C#,Wpf,Wpf Controls,Wpfdatagrid,我尝试了很多选择,但似乎没有一个适合我。问题是: 动态列。我有一份字典的清单。所有字典可能有不同的键。 例如 我需要将包含所有键的网格显示为以下列: [key1] [key2] [key4] [key5] 111 222 333 444 777 这很简单,我只是在代码中为GridView或DataGrid生成列 但还有第二个要求: 我需要根据单元格中的值为特定单元格着色。 例如,对于111 bg颜色应为绿色,对于3

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

动态列。我有一份字典的清单。所有字典可能有不同的键。 例如

我需要将包含所有键的网格显示为以下列:

[key1] [key2] [key4] [key5]
  111    222
  333           444
                       777
这很简单,我只是在代码中为GridView或DataGrid生成列

但还有第二个要求:

我需要根据单元格中的值为特定单元格着色。 例如,对于111 bg颜色应为绿色,对于333 bg颜色应为红色等

目前我只能让一部分工作。我可以动态创建列,但不能给它们着色。或者,我可以创建静态列并创建自定义单元格模板,其中包含bg颜色的绑定。但是,在每个模板中,我必须指定绑定。所以模板的数量会很大。 有没有一种方法可以在不为每一列生成模板的情况下实现我所需要的


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

我不确定我是否完全理解您的问题,但它应该非常简单。DataGrid具有惊人的灵活性

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

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

当您动态生成列时,可以将
DataGridTextColumn.CellTemplate
设置为LoadDynamicalyxaml(“您的资源”)。当您生成列时,您可以访问DataGrid资源,也可以从中获取CellTemplate,这是一种更干净的方法


您可以为包含
数据触发器的
文本块定义
样式
,然后将该
样式
应用于动态创建列中的
文本块
。。。在代码变长之前,此方法应适用于多达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>

您可以使用的另一种方法是将
转换器
类与
绑定一起使用。你可以在许多在线帖子中找到这样做的详细例子。。。以下是一些:



是的,我试过你展示的东西。但是,不幸的是,TextBlock的DataContext是整个字典。所以我无法获得实际值。转换为字符串的值(从文本绑定)不适合。
<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>