Klasik
Klasik

Reputation: 892

Change DataGrid row color by value in DataGrid column using converter

I created DataGrid and filled it with values from database.

Now I need color rows of datagrid like that:

  1. Row is green if CheckBox of row is checked and column NANO_status value is 1 and PLC_status true.
  2. Row is Yellow if CheckBox of row is checked and column NANO_status value is 0
  3. Row is Red if CheckBox of row is checked and (column NANO_status value 2 OR column NANO_status value 1 and PLC_status false OR column NANO_status value 0 and PLC_status true).
  4. Row is standard color if CheckBox of row is unchecked or checked and (NANO_status or PLC_STATUS) empty.

thinking that best is to use converters.

already created converter class:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var isOnline = (bool)value;
    if (isOnline)
    {
        return Brushes.Green;
    }
    else
        return Brushes.Red;
}

cant figurate how property bind it to get required result. There is how I tried:

<Window.Resources>
    <converters:StateToBrushConverter x:Key="StateToBrush"/>
</Window.Resources>

<Border Padding="5">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>            
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Filter" Margin="5"/>
            <TextBox Text="{Binding FilterText,UpdateSourceTrigger=PropertyChanged}" Width="200" Margin="5"/>
        </StackPanel>
        <DataGrid  Grid.Row="1"  AutoGenerateColumns="false" ItemsSource="{Binding Items}" >
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow }">
                    <Setter Property="Background" Value="{Binding ACTIVE, Converter={StaticResource StateToBrush}}"></Setter>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.Columns>
                <DataGridCheckBoxColumn x:Name="DGC" Header="ACTIVE" Binding="{Binding ACTIVE}"/>
                <DataGridTextColumn Header="DEVICE" Binding="{Binding DEVICE}"/>
                <DataGridTextColumn Header="NANO IP" Binding="{Binding NANO_IP}"/>
                <DataGridTextColumn Header="PLC IP" Binding="{Binding PLC_IP}"/>
                <DataGridTextColumn Header="NANO STATUS" Binding="{Binding NANO_STATUS}"/>
                <DataGridTextColumn Header="PLC STATUS" Binding="{Binding PLC_STATUS}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

please help figurate how color row of datagrid by several cell status.

Upvotes: 0

Views: 593

Answers (1)

Jophy job
Jophy job

Reputation: 1964

You can do this just by using multidata trigger

<DataGrid.RowStyle>
   <Style TargetType="DataGridRow">
        <Style.Triggers>
            <MultiDataTrigger >
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=NANO_STATUS}" Value="True" />
                    <Condition Binding="{Binding Path=PLC_STATUS}" Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Background" Value="Red" />
            </MultiDataTrigger>
        </Style.Triggers>
        <Setter Property="Background" Value="Green" />
    </Style>
</DataGrid.RowStyle>

Upvotes: 2

Related Questions