WPF使用转换器更改datagrid单元格背景颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF使用转换器更改datagrid单元格背景颜色相关的知识,希望对你有一定的参考价值。

我有一个WPF数据网格。我需要比较两个类型为datetime的列,根据比较结果,我为当前列和行中的两个单元格设置了单元格背景颜色。我为每个数据网格行执行此操作。为了做到这一点,我使用转换器。

<my:DataGridTextColumn Binding="{Binding Path=Date1, StringFormat={0:dd/MM/yyyy}}" Header="Date">
    <my:DataGridTextColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource CellDateColorConverter}">
                        <Binding Path="Date1"/>
                        <Binding Path="Date2"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
         </Style>
    </my:DataGridTextColumn.ElementStyle>
</my:DataGridTextColumn>

<my:DataGridTextColumn Binding="{Binding Path=Date2, StringFormat={0:dd/MM/yyyy}}" Header="Date">
    <my:DataGridTextColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource CellDateColorConverter}">
                        <Binding Path="Date1"/>
                        <Binding Path="Date2"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
         </Style>
    </my:DataGridTextColumn.ElementStyle>
</my:DataGridTextColumn>

转换器:

public class CellDateColorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values[0] is DateTime && values[1] is DateTime)
        {
            DateTime date1 = (DateTime)values[0];
            DateTime date2= (DateTime)values[1];                

            if (date1.Date > date2.Date)
            {
                return Color.Brown;
            }
        }

        return ????? // I need to return the default datagrid cell's background color. How to do this?
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException("CellDateColorConverter is a OneWay converter.");
    }
}

我有两个问题:

  1. 当date1> date2单元格背景颜色未更新为棕色时。
  2. 如果date1 <= date2,应返回默认的datagrid单元格背景颜色,我不知道如何执行此操作。

我还为datagrid定义了一种行样式。行样式根据某些条件设置整个行背景颜色。但在这种情况下,这些条件不满足,但上面的列样式(date1.Date> date2.Date)确实如此,因此单元格背景应该用棕色绘制。

利用这篇文章,如果满足行样式的条件,并且整个背景设置为例如橙色,如果单元格样式(在这篇文章中上面)也满足并且需要用棕色绘制,那么哪个占优势?行样式或单元格样式?

答案
  1. 返回Brushif (date1.Date > date2.Date) { return System.Windows.Media.Brushes.Brown; }
  2. 返回System.Windows.Data.Binding.DoNothing

以上是关于WPF使用转换器更改datagrid单元格背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

根据值更改 DataGrid 单元格颜色

在Timer Tick C#表单上更改DataGrid单元格的背景颜色

C# wpf datagrid 动态加载数据后改变单元格颜色bug

选择后更改整个数据网格行的背景颜色

C#WPF根据数据长度编辑datagrid单元格颜色

WPF DataGrid动态生成列的单元格背景色绑定