首页 > 解决方案 > 更改数据网格单元格颜色

问题描述

这是一个常见的问题,但仍然不知道如何使它工作。我正在执行记录器并想在单元格上设置红色。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>

代码:

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 });
    }
}

试图直接在“颜色”字段中传递画笔 - 不工作(Message1 列)。尝试使用转换器(Message2 列),仍然没有结果。不知道怎么了。

标签: c#wpfdata-binding

解决方案


MainWindow看法:

<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班级:

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
        });
    }
}

结果截图: 应用截图


推荐阅读