WPF DataGrid着色 - 行和单元的自定义着色

时间:2014-08-14 21:53:46

标签: c# wpf datagrid

我有一个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来获得工作解决方案,但滚动时它将无法正确显示,除非我在网格上禁用了行虚拟化。这将导致它在包含大量数据的网格上执行非常糟糕。

1 个答案:

答案 0 :(得分:1)

对于以下条件,您似乎只对将单元格绘制到LightGreen感兴趣:

  1. 列名称是“今日运行”。
  2. 单元格文本为是。
  3. 未选择单元格。
  4. 但是,如果转换器到位,您最终会为不满足上述条件(透明)的单元格设置背景,从而导致一些问题。可能会覆盖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>