Изменить цвет ячейки DataGrid WPF относительно диапазона - PullRequest
2 голосов
/ 08 августа 2011

Привет Мне нужно реализовать функцию, которая, если значение элементов привязки находится в пределах определенного диапазона, цвет ячейки должен соответствовать диапазону.

Я использовал Изменение цвета фона DataGridЯчейка WPF 4

это прекрасно работает, но это только для тех значений, которые есть. Что если я хочу добавить диапазон, то есть от 10 до 20, это красный, 21-30, это синий

добавил все и увидел пример в конце, но цвет здесь не меняется - код

Класс

 public class ConvertToBrush : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int tempValue = int.Parse(value.ToString());
            string tempString = "Red";
            if (tempValue >= 0 && tempValue <= 20)
                tempString = "#FF0000";

            if (tempValue > 20 && tempValue <= 40)
                tempString = "#F09300";

            if (tempValue > 40 && tempValue <= 60)
                tempString = "#EDDF00";

            if (tempValue > 60 && tempValue <= 80)
                tempString = "#FFFFFF";

            if (tempValue > 80 && tempValue <= 100)
                tempString = "#85AB00";


            SolidColorBrush brush = new SolidColorBrush();
            BrushConverter conv = new BrushConverter();
            brush = conv.ConvertFromString(tempString) as SolidColorBrush;
            return brush;

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {

            return DependencyProperty.UnsetValue;
        }
    }

XMAL

  <DataGridTextColumn ElementStyle="{StaticResource CentreAlignStyle}" Binding="{Binding TestResults}" Header="Results" IsReadOnly="True" MaxWidth="60" MinWidth="60" >
                                        <DataGridTextColumn.CellStyle>
                                            <Style>
                                                <Setter Property="TextBlock.Background" Value="{Binding TestResults, Converter={StaticResource makeBrush}}" />
                                            </Style>
                                        </DataGridTextColumn.CellStyle>
                                    </DataGridTextColumn>

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Не используйте DataTrigger, а просто привяжите Background к значению и вставьте ValueConverter, чтобы вернуть нужную кисть (или вообще не рисовать).

Редактировать: Как должно выглядеть использование:

<DataGridTextColumn.CellStyle>
    <Style>
         <Setter Property="Border.Background" Value="{Binding TestResults, Converter={StaticResource BrushConverter}}" />
    </Style>
</DataGridTextColumn.CellStyle>
1 голос
/ 09 августа 2011

Я не уверен, что правильно вас понял, но вот так:

Итак, допустим, что «TestResults» содержит значение, о котором вы говорите.В XAML:

<DataGridTextColumn TextBlock.Background={Binding TestResults, Converter={StaticResource makeBrush}} />

Просто чтобы убедиться, что мы находимся на той же странице, вы определяете конвертер в своем XAML следующим образом:

    <Window.Resources>
        <local:makeBrush x:Key="makeBrush" />
    </Window.Resources>

В конвертере makeBrush высделайте это:

public class makeBrush : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int theValueToConvertToColor = (int)value;
        if (theValueToConvertToColor > 10 && theValueToConvertToColor <= 20)
        {
            return Brushes.Red;
        }
        if (theValueToConvertToColor > 20 && theValueToConvertToColor <= 30)
        {
            return Brushes.Blue;
        }
        //More ifs...
        else return Brushes.Green;            
    }

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

"object value", который вы получаете в методе Convert вашего IValueConverter, фактически является значением "TestResults"

Примечание: Iна самом деле не проверял его с DataGridTextColumn, но я думаю, вы поняли и можете внести необходимые корректировки, если потребуется.

...