WPF 使用转换器更改数据网格单元格背景颜色
WPF Change datagrid cell background color using a converter
我有一个 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.");
}
}
这里我有两个问题:
- 当 date1 > date2 单元格背景颜色未更新为棕色时。
- 如果 date1 <= date2,应该返回默认的数据网格单元格背景颜色,但我不知道该怎么做。
我还为数据网格定义了行样式。行样式根据某些条件设置整行背景颜色。但是在这种情况下,不满足这些条件,但上面的列样式 (date1.Date > date2.Date) 满足,所以单元格背景应该涂成棕色。
利用这个post,如果满足行样式的条件,并且整个背景设置为例如橙色,如果单元格列样式(在这个post上方)也是满意又要涂成棕色,那哪个好呢?行样式还是单元格样式?
Return一个Brush
:
if (date1.Date > date2.Date)
{
return System.Windows.Media.Brushes.Brown;
}
Return System.Windows.Data.Binding.DoNothing
.
我有一个 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.");
}
}
这里我有两个问题:
- 当 date1 > date2 单元格背景颜色未更新为棕色时。
- 如果 date1 <= date2,应该返回默认的数据网格单元格背景颜色,但我不知道该怎么做。
我还为数据网格定义了行样式。行样式根据某些条件设置整行背景颜色。但是在这种情况下,不满足这些条件,但上面的列样式 (date1.Date > date2.Date) 满足,所以单元格背景应该涂成棕色。
利用这个post,如果满足行样式的条件,并且整个背景设置为例如橙色,如果单元格列样式(在这个post上方)也是满意又要涂成棕色,那哪个好呢?行样式还是单元格样式?
Return一个
Brush
:if (date1.Date > date2.Date) { return System.Windows.Media.Brushes.Brown; }
Return
System.Windows.Data.Binding.DoNothing
.