我有一个WPF DataGrid控件,它使用自定义着色数据行和单个数据单元格 . 有些行需要着色,但也有一些单独的单元需要显示特定的颜色,而不管它们的行的背景颜色 . 我正在处理这样的着色:
<DataGrid.Resources>
<!--Row Coloring-->
<Style TargetType="DataGridRow" >
<Style.Triggers>
<DataTrigger Binding="{Binding IsInactive}" Value="True">
<Setter Property="Background" Value="DarkGray" />
</DataTrigger>
</Style.Triggers>
</Style>
<!--Cell Coloring-->
<local:ColorConverter_RunToday x:Key="converter_RunToday"/>
<Style TargetType="DataGridCell" >
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header}" Value="Run Today">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource converter_RunToday}}"/>
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource converter_RunToday}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
我的颜色转换器类是:
public class ColorConverter_RunToday : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = value.ToString().Trim().ToUpper();
if (str == "YES")
return Brushes.LightGreen;
return Brushes.Transparent;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
此设置的唯一问题是具有自定义着色的“今日运行”单元格将永远不会具有该行的背景颜色 . 将颜色设置为Brushes.Transparent仍然只是在单元格的文本不是“YES”时将单元格着色为白色 . 此外,当我选择该行时,自定义单元格不会获得正常的蓝色高亮颜色 .
我之前通过以编程方式单独着色每个单元而不是使用XAML来获得工作解决方案,但滚动时它将无法正确显示,除非我在网格上禁用了行虚拟化 . 这将导致它在包含大量数据的网格上执行得非常糟糕 .
1 回答
您似乎只对以下条件将单元格绘制到LightGreen感兴趣:
列名称是“今天运行” .
单元格文本为是 .
未选择单元格 .
但是,在转换器到位的情况下,您最终会为不满足上述条件(透明)的单元格设置背景,从而导致一些问题 . 可能会覆盖dataGrid的默认值,因此请尽量避免这种情况 .
我建议用 MultiDataTrigger 实现这个目的,并在那里提供3个以上的条件 . (不需要转换器)