【问题标题】:Changing datagrid cell color更改数据网格单元格颜色
【发布时间】: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颜色,请您尝试澄清您的意思
  • 我想更改文本颜色(前景)。但没有效果。
  • 尝试将&lt;DataGridTextColumn.CellStyle&gt; 更改为:&lt;DataGridTextColumn.ElementStyle&gt;,然后将&lt;Style TargetType="DataGridCell"&gt; 更改为:&lt;Style TargetType="{x:Type TextBlock}"&gt; 并尝试一下,因为这就是我所做的,这就是我的结果:@ 987654322@

标签: c# wpf data-binding


【解决方案1】:

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

结果截图:

【讨论】:

  • 如您所见,我唯一更改的是DataGridTextColumn.ElementStyleTargetType,它可以按您的要求工作。
  • 还是没有结果:很奇怪ibb.co/f9pvPmw
  • 您能重新构建您的项目以确保它是最新的吗?我不知道为什么你没有得到相同的结果,如果重建不起作用,可能关闭并重新打开 Visual Studio 可能会有所帮助,就像我说的那样,我发送的代码工作正常且最少与您的原始代码相比发生了变化
  • 重启系统,重建/清理项目。还是没有结果,太郁闷了……奇怪的事情……你能发一份包含邮件来源的存档吗?
  • 也在 Win8.1 操作系统上重建。我正常使用Win10。见鬼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多