我有一个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();
}
}
此设置的唯一问题是&#34;今天运行&#34;具有自定义着色的单元格将永远不会具有该行的背景颜色。将颜色设置为Brushes.Transparent仍然只是在单元格的文本不是&#34;是&#34;时将单元格着色为白色。此外,当我选择该行时,自定义单元格不会获得正常的蓝色高亮颜色。
我以前通过以编程方式单独着色每个单元而不是使用XAML来获得工作解决方案,但滚动时它将无法正确显示,除非我在网格上禁用了行虚拟化。这将导致它在包含大量数据的网格上执行非常糟糕。
答案 0 :(得分:1)
对于以下条件,您似乎只对将单元格绘制到LightGreen感兴趣:
但是,如果转换器到位,您最终会为不满足上述条件(透明)的单元格设置背景,从而导致一些问题。可能会覆盖dataGrid的默认值,所以尽量避免这种情况。
我建议使用 MultiDataTrigger
来实现此目的,并在那里提供以上3个条件。 (无需转换器)
<Style TargetType="DataGridCell" >
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header}" Value="Run Today"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text}" Value="Yes"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="LightGreen"/>
<Setter Property="BorderBrush" Value="LightGreen"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>