Изменение фона DataGridTextColumn, если значение находится между a и b - PullRequest
0 голосов
/ 02 мая 2018

Поэтому я пытаюсь изменить фон ячейки в Datagrid в зависимости от ее значения. Поэтому, если бы я хотел изменить его в зависимости от статического значения, я бы использовал StyleTrigger, но это не так.

Например: я хочу зеленый фон, если значение ячейки находится между 80 и 100, оранжевый фон, если значение находится между 40 и 79, и красный фон, если он ниже 40 ... Как бы я это сделал?

В настоящее время я использую StyleTrigger только для тестирования, так что не против ...

Вот мой код XAML:

<DataGrid Background="LightGray" ItemsSource="{Binding Source={StaticResource Properties}, Path=TableData}"
                  AutoGenerateColumns="False" IsReadOnly="True">
            <DataGrid.Columns >
                <DataGridTextColumn Width="100" Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Batterie" Binding="{Binding Battery}" >
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <Trigger Property="Text" Value="83">
                                    <Setter Property="Background" Value="LightGreen"/>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Current Use" Binding="{Binding CurrentUse}"></DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Occupancy" Binding="{Binding Occupancy}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>

Любая помощь приветствуется !!

1 Ответ

0 голосов
/ 03 мая 2018

Я решил эту проблему, написав конвертер, который реализует интерфейс IValueConverter.

если вы хотите увидеть свой конвертер в XAML, вам нужно сослаться на статический ресурс, подобный этому

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

Мой дизайн;

    <Grid>
        <DataGrid Name="dgList" Background="LightGray" AutoGenerateColumns="False" IsReadOnly="True">
            <DataGrid.Columns >
                <DataGridTextColumn Width="100" Header="ID" Binding="{Binding ID}"></DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Batterie" Binding="{Binding Battery}" >
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="Background" Value="{Binding Battery, Converter={StaticResource myConverter}}"></Setter>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Current Use" Binding="{Binding CurrentUse}"></DataGridTextColumn>
                <DataGridTextColumn Width="100" Header="Occupancy" Binding="{Binding Occupancy}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

Эта привязка берет ваши данные Battery (10,30,40,80 и т. Д.) И отправляет конвертеру. Преобразователь возвращает объект, и наш объект должен быть SolidColorBrush, чтобы связать его для BackGround. Это все .Я решил так

<Setter Property="Background" Value="{Binding Battery, Converter={StaticResource myConverter}}"></Setter>

myConverter для преобразования данных в фоновый режим;

public class myConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush clr;
        if (int.Parse(value.ToString()) >= 80)
            clr = new SolidColorBrush(Colors.Green);
        else if (int.Parse(value.ToString()) >= 40)
            clr = new SolidColorBrush(Colors.Orange);
        else if (int.Parse(value.ToString()) >= 0)
            clr = new SolidColorBrush(Colors.Red);
        else
            clr = new SolidColorBrush(Colors.White);

        return clr;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Я создал класс для вашего примера (я не видел ваш, если я ошибаюсь, извините)

public class Class1
{
    public int ID { get; set; }       
    public string Battery { get; set; }
    public string CurrentUse { get; set; }
    public string Occupancy { get; set; }

    public static List<Class1> myList = new List<Class1>()
    {
        new Class1() {ID = 1, Battery = "70", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 2, Battery = "100", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 3, Battery = "10", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 4, Battery = "50", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 5, Battery = "80", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 6, Battery = "40", CurrentUse = "xxxx", Occupancy = "xxxx" },
        new Class1() {ID = 7, Battery = "39", CurrentUse = "xxxx", Occupancy = "xxxx" }
    };
}

в главном окне

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    dgList.ItemsSource = Class1.myList;
}

Мои скриншоты из проекта.

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...