Как установить цвет фона части строки WPF DataGrid в зависимости от значений столбца? - PullRequest
1 голос
/ 05 апреля 2011

Скажем, у меня есть DataGrid с 5 столбцами, загруженными (используя 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 ]

2 голосов
/ 05 апреля 2011

Возможно, вам нужно использовать пользовательские столбцы, тогда вы можете передать всю строку в конвертер, используя 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();
    }
}
0 голосов
/ 05 апреля 2011

Если вам нужно решение с внутренним кодом, я уверен, что вы можете получить событие LoadingRow, чтобы проверить текст данных отдельной строки и найти сгенерированную ячейку таким же образом. Хотя раньше я этого не делал!

...