maxspb89
maxspb89

Reputation: 101

Changing datagrid cell color

This is frequent question, but still don't know how to make it work. I'm performing a logger and want to set red color on cell. XAML:

<Window.Resources>
    <local:LogLevelToColorConverter  x:Key="colorConverter"/>
</Window.Resources>
<Grid>
    <DataGrid x:Name="dgLog"   AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn  Header="Date and time" Binding="{Binding DateTime}"  Width="120"/>
            <DataGridTextColumn  Header="Message1" Binding="{Binding Message}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="Foreground" 
                            Value="{Binding Color}" />
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
            <DataGridTextColumn  Header="Message2" Binding="{Binding Message}" Foreground="{Binding Level,Converter={StaticResource colorConverter}}"/>
           
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Code:

namespace DGTest {
public class LogLevelToColorConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value is string level) {
            var brush = Brushes.White;
            if (level == "WARN") {
                brush = Brushes.Yellow;
            }
            else if (level == "ERROR") {
                brush = Brushes.Red;
            }
            return brush;

        }
        return Brushes.White;
    }

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

public class LogMessage {
    public string DateTime { get; set; }
    public string Level { get; set; }
    public string Message { get; set; }
    public Brush Color { get; set; }
}

public partial class MainWindow : Window {
    readonly ObservableCollection<LogMessage> logMessages = new ObservableCollection<LogMessage>();
    
    public MainWindow() {
        InitializeComponent();
        dgLog.ItemsSource = logMessages;
        logMessages.Add(new LogMessage { DateTime = DateTime.Now.ToString(), Level = "ERROR", Message = "Test message", Color = Brushes.Red });
    }
}

Tried to pass Brush in "Color" field directly - not working (Message1 column). Tried with Converter (Message2 column), still no result. Don't know what's wrong.

Upvotes: 0

Views: 264

Answers (1)

ConnorTJ
ConnorTJ

Reputation: 396

MainWindow View:

<Grid>
    <DataGrid x:Name="dgLog" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn  Header="Date and time" Binding="{Binding DateTime}"  Width="120"/>
            <DataGridTextColumn  Header="Message" Binding="{Binding Message}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Foreground" Value="{Binding Color}" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

LogMessage Class:

public class LogMessage
{
    public string DateTime { get; set; }
    public string Level { get; set; }
    public string Message { get; set; }
    public Brush Color { get; set; }
}

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    readonly ObservableCollection<LogMessage> logMessages = new ObservableCollection<LogMessage>();

    public MainWindow()
    {
        InitializeComponent();
        dgLog.ItemsSource = logMessages;
        logMessages.Add(new LogMessage 
        { 
            DateTime = DateTime.Now.ToString(), 
            Level = "ERROR", 
            Message = "Test message", 
            Color = Brushes.Red
        });
    }
}

Result screenshot: Screenshot of App

Upvotes: 2

Related Questions