根据附加 属性 更改 DataGrid 列的背景颜色

Change background colour of a DataGrid column based on attached property

我正在尝试设置 DataGrid 的样式,以便如果列有附加的 属性 以指示它是否突出显示。因此,Highlighted = true 列中的那些单元格与 Highlighted = false 的列具有不同的颜色。

我的附件属性看起来像:

public static class Highlighted
{
    public static bool GetIsHighlighted(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsHighlightedProperty);
    }

    public static void SetIsHighlighted(DependencyObject obj, bool value)
    {
        obj.SetValue(IsHighlightedProperty, value);
    }

    public static readonly DependencyProperty IsHighlightedProperty =
        DependencyProperty.RegisterAttached("IsHighlighted", typeof(bool), typeof(Highlighted), new UIPropertyMetadata(false));
}

DataGridCell 样式如下:

<Style x:Key="WeldOfficeDataGridCell" TargetType="{x:Type DataGridCell}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{x:Static SystemColors.ActiveBorderBrush}"
                        BorderThickness="0.5"
                        Background="FloralWhite" SnapsToDevicePixels="True">
                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" 
                                      Content="{TemplateBinding Content}" 
                                      ContentStringFormat="{TemplateBinding ContentStringFormat}" 
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                      VerticalAlignment="Center"
                                      Margin="15,5,5,5" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="attachedProperties:Highlighted.IsHighlighted" Value="True">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="Red" />
                </Setter.Value>
            </Setter>
        </Trigger>

        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="{DynamicResource AccentColor2}" />
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

我将 DataGrid 中的 属性 设置为:

    <DataGrid Margin="27,17,0,0"
              Grid.Column="1"
              ItemsSource="{Binding FilterableBaseMaterials}" 
              AutoGenerateColumns="False" 
              SelectionMode="Single"
              HeadersVisibility="Column"
              CanUserAddRows="False"
              CanUserDeleteRows="False"
              CanUserResizeRows="False"
              Background="{x:Null}">

        <DataGrid.Resources>
            <helpers:BindingProxy x:Key="proxy" Data="{Binding}" />
        </DataGrid.Resources>

        <DataGrid.Columns>

            <DataGridTemplateColumn Header="Specification" IsReadOnly="True" attachedProperties:Highlighted.IsHighlighted="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            ...

但经过几个令人沮丧的小时后,我无法弄清楚如何让它工作,我的 Style.Trigger 对于附加的 属性 是错误的,因为它永远不会触发颜色的变化,我想是因为我将 属性 附加到列而不是 DataGridCell 但我不知道如何让它工作,任何帮助将不胜感激。

您正在设置 的附加 属性 IsHighlighted。这与在 单元格 上设置它不同。

您应该将它设置在最终由该列创建的单元格上。在纯 XAML 中执行此操作的唯一方法是为列定义一个 CellStyle

<DataGridTemplateColumn Header="Specification" IsReadOnly="True">
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="DataGridCell" BasedOn="{StaticResource WeldOfficeDataGridCell}">
            <Setter Property="attachedProperties:Highlighted.IsHighlighted" Value="True" />
        </Style>
    </DataGridTemplateColumn.CellStyle>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>