首页 文章

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

提问于
浏览
0

我有一个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 回答

  • 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>
    

相关问题