c# - 更改数据网格单元格颜色
问题描述
这是一个常见的问题,但仍然不知道如何使它工作。我正在执行记录器并想在单元格上设置红色。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 列),仍然没有结果。不知道怎么了。
解决方案
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
});
}
}
推荐阅读
- php - nginx + php-fpm 产生 300ms 开销
- css - 如何将表单字段与文本内联?
- c# - 如果在加载时更改内容,则 StackPanel 中的 WPF 标签不会调整大小
- node.js - 从 readline 的线路回调中进行异步调用?
- embedded-linux - dbus-daemon --session 给出循环包含错误
- php - 根据下拉选择使用 PHP/MySQL 更改数据库
- docker - kafka消费者无法连接
- php - 在一定数量的列之后拆分html表
- java - 端点返回对象而不是直接 JSON
- java - 使用 Java 8 流查找数组中对角线元素的总和