如何根据列值设置WPF DataGrid行的部分背景颜色?

时间:2011-04-05 18:52:06

标签: wpf datagrid binding wpfdatagrid

假设我有一个包含5列的DataGrid,从自定义类集合中加载(使用AutoGenerateColumns = True)。根据第一,第三和第四列中的值,我需要使用以下选项之一设置行的背景:

col num:    1    2    3    4    5
 Option1: gray gray gray gray gray
 Option2: gray red  red  gray gray
 Option3: gray gray gray red  red
 Option4: gray blue blue blue blue

这需要分别对每一行进行。

我已经看到了为行背景设置转换器的一些示例,但是如何设置单个单元格背景?

2 个答案:

答案 0 :(得分:2)

您可能需要使用自定义列,然后您可以将整行传递到转换器,同时使用ConverterParameter指定当前列,这样您就可以比较所有值:

<DataGridTextColumn Binding="{Binding Column1}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background"
                    Value="{Binding Converter={StaticResource ValueToBrushConverter},
                                    ConverterParameter=1}"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Column2}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Background"
                    Value="{Binding Converter={StaticResource ValueToBrushConverter},
                                    ConverterParameter=2}"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!-- ... -->

我不是那个你的表,但你可能想出如何在转换器中自行返回正确的值。


转换器骨架可能是这样的:

public class ValueToBrushConverter : IValueConverter
{
    /// <summary>
    /// 1st Indexer: Columns
    /// 2nd Indexer: Options
    /// </summary>
    Brush[,] _brushMatrix = new Brush[5,4]
    {
        { Brushes.Gray, Brushes.Gray, Brushes.Gray, Brushes.Gray },
        { Brushes.Gray, Brushes.Red, Brushes.Gray, Brushes.Blue },
        { Brushes.Gray, Brushes.Red, Brushes.Gray, Brushes.Blue },
        { Brushes.Gray, Brushes.Gray, Brushes.Red, Brushes.Blue },
        { Brushes.Gray, Brushes.Gray, Brushes.Red, Brushes.Blue }
    };

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        RowDataItem item = value as RowDataItem;
        int currentColumn = int.Parse(parameter as string);
        int currentRowOption;

        #region Internal logic here, e.g
        if (item.Col1 == "I" && item.Col3 == "Love" && item.Col2 == "Converters")
        {
            currentRowOption = 1;
        }
        //...
        #endregion

        return _brushMatrix[currentColumn, currentRowOption];
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

答案 1 :(得分:0)

如果您需要后端代码解决方案,我确信您可以获取LoadingRow事件来检查单个行的datacontext,并以此方式查找生成的单元格。我之前没有这样做过!