【发布时间】:2021-10-28 08:19:30
【问题描述】:
这是一个常见的问题,但仍然不知道如何使它工作。我正在执行记录器并想在单元格上设置红色。 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 });
}
}
试图直接在“颜色”字段中传递画笔 - 不起作用(消息 1 列)。尝试使用转换器(Message2 列),仍然没有结果。不知道怎么回事。
【问题讨论】:
-
我认为您可能已经使用了上一个答案中的一些代码,但看起来您在 XAML 中使用
Trigger Property掩盖了第一个代码 sn-p:stackoverflow.com/a/5551986/13108684 这可能让您更轻松,因为您可以为level设置不同的条件并在单元格上设置不同的前景色 -
感谢您的回答,这种方法效果很好,刚刚测试过。但我也需要用消息绘制单元格(不仅是有级别的单元格)。
-
你不是已经为带有标题的单元格做了那个吗:
Message1?使用{Binding Message}。当我在本地运行它时,它可以正常工作并将Text Colour更改为Red,它不会更改单元格背景,因为您正在设置Foreground颜色,请您尝试澄清您的意思 -
我想更改文本颜色(前景)。但没有效果。
-
尝试将
<DataGridTextColumn.CellStyle>更改为:<DataGridTextColumn.ElementStyle>,然后将<Style TargetType="DataGridCell">更改为:<Style TargetType="{x:Type TextBlock}">并尝试一下,因为这就是我所做的,这就是我的结果:@ 987654322@
标签: c# wpf data-binding