WPF DataGrid 行着色

WPF DataGrid Row Coloring

我有一个数据网格,其中行的状态可能具有颜色代码或数据,需要将它们加粗。我已经能够轻松地让粗体工作。如果它确实有颜色代码,我希望整行背景都以该颜色显示。我已经搜索了几个站点并尝试了许多不同的方法来对行进行颜色编码,但其中 none 似乎有效。我错过了什么?
Datagrid.xaml(样式):

<Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="#FFFFFF" />
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
        <Setter Property="ValidationErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Margin="2,0,0,0"
                               VerticalAlignment="Center"
                               Foreground="Red"
                               Text="!" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Border x:Name="DGR_Border"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            SnapsToDevicePixels="True">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                <GradientStop Offset="0" Color="#AAFFFF" />
                                <GradientStop Offset="1" Color="#AAFFD4" />
                            </LinearGradientBrush>
                        </Border.Background>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal_AlternatingRow">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#E6F7FF" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal_Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#2e90d1" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#2980b9" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFE6" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFF80" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <SelectiveScrollingGrid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="Auto" />
                            </SelectiveScrollingGrid.RowDefinitions>
                            <DataGridCellsPresenter Grid.Column="1"
                                                    ItemsPanel="{TemplateBinding ItemsPanel}"
                                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            <DataGridDetailsPresenter Grid.Row="1"
                                                      Grid.Column="1"
                                                      SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen,
                                                                                                                     ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical},
                                                                                                                     Converter={x:Static DataGrid.RowDetailsScrollingConverter},
                                                                                                                     RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                                      Visibility="{TemplateBinding DetailsVisibility}" />
                            <DataGridRowHeader Grid.RowSpan="2"
                                               SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                                               Visibility="{Binding HeadersVisibility,
                                                                    ConverterParameter={x:Static DataGridHeadersVisibility.Row},
                                                                    Converter={x:Static DataGrid.HeadersVisibilityConverter},
                                                                    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border x:Name="border"
                            Background="Transparent"
                            BorderBrush="Transparent"
                            BorderThickness="1"
                            SnapsToDevicePixels="True">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Unfocused" />
                                <VisualState x:Name="Focused" />
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="CurrentStates">
                                <VisualState x:Name="Regular" />
                                <VisualState x:Name="Current">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="Gray" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ListManager.xaml (形式):

<DataGrid 
                              SelectedItem="{Binding SelectedLead, Mode=TwoWay}" 
                              ItemsSource="{Binding LeadListFiltered}" 
                              x:Name="grdWorkLeadList"
                              AutoGenerateColumns="False"
                              Margin="-10,8,2,0"
                              IsReadOnly="True"
                              AlternationCount="2"
                        SelectionChanged="grdWorkLeadList_SelectionChanged"
                        LoadingRow="grdWorkLeadList_LoadingRow">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Campaign" Binding="{Binding SetupCampaign.Name}" />
                            <DataGridTextColumn Header="Action Status" Binding="{Binding ActionStatus}" />
                            <DataGridTextColumn Header="Action Date" Binding="{Binding ActionDate,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTemplateColumn Header="Name" SortMemberPath="Lastname">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock>
                                            <Run Text="{Binding Title }" />
                                            <Run Text=" " />
                                            <Run Text="{Binding Firstname }" />
                                            <Run Text=" " />
                                            <Run Text="{Binding Lastname }" />
                                        </TextBlock>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Header="Product" Binding="{Binding Product  }" />
                            <DataGridTextColumn Header="Sailing" Binding="{Binding Sailing,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Stateroom" Binding="{Binding Stateroom  }" />
                            <DataGridTextColumn Header="Booking Date" Binding="{Binding BookingDate,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Cancel Date" Binding="{Binding CancelDate,StringFormat=\{0:MM dd yyyy\}}"  />
                            <DataGridTextColumn Header="Disposition" Binding="{Binding DispositionValue}" />
                            <DataGridTextColumn Header="Booking" Binding="{Binding Booking  }" />
                            <DataGridTextColumn Header="Run Date" Binding="{Binding RunDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Phone" Binding="{Binding Phone  }" />
                            <DataGridTextColumn Header="Followup" Binding="{Binding ActionFollowup}" />
                            <DataGridTextColumn Header="ID" Binding="{Binding ID    }" />
                            <DataGridTextColumn Header="Assigned Agent" Binding="{Binding AssignedAgent }" />
                            <DataGridTextColumn Header="Active" Binding="{Binding ActiveStatus  }" />
                            <DataGridTextColumn Header="Disposition Date" Binding="{Binding DispositionDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Rebook #" Binding="{Binding ReBookNumber    }" />
                            <DataGridTextColumn Header="Close Date" Binding="{Binding CloseDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Reason" Binding="{Binding ReasonDescription}" />
                            <DataGridTextColumn Header="Code" Binding="{Binding Code    }" />
                        </DataGrid.Columns>
                    </DataGrid>

代码隐藏 (cs):

private void grdWorkLeadList_LoadingRow(object sender, DataGridRowEventArgs e)
{
    Lead item = e.Row.Item as Lead;

    string color;
    if (item != null)
    {
        //handle status colors
        if (item.CurrentDisposition != null)
            using (var db = new DAOutboundCM_DEVEntities())
            {
                color = (from d in db.SetupDispositionLists where d.ID == item.CurrentDisposition select d.Color).Single();
                e.Row.Background = new SolidColorBrush((Color) ColorConverter.ConvertFromString(color));
                e.Row.UpdateLayout();

            }

        //handle priority bolding
        if (item.SetupCampaign.Name.Contains("Quotes"))
            if (item.Phone != null && item.Phone != "")
                e.Row.FontWeight = FontWeights.Bold;
    }
}

在 WPF 中,最好只设置一次 属性,否则会出现意外行为。我猜为什么粗体起作用而着色不起作用是因为尽管您在代码后面设置了两者,但您还在样式中设置了背景颜色。

删除样式中的 setter 后问题是否仍然存在?

<Setter Property="Background" Value="#FFFFFF"/>

编辑

您似乎无法在代码隐藏中指定背景颜色,因为您尚未在模板中实现背景 属性。

prop="{TemplateBinding Background}"

深入挖掘后发现您还在代码中设置了 3 次背景。

  1. 您已经删除的虚拟行
  2. 加载行时在代码后面
  3. 通过模板化 VisualStates 的行背景

要查看您的代码是否有效,您可以

替换

<Border x:Name="DGR_Border"
        BorderBrush="{TemplateBinding Background}"
        BorderThickness="{TemplateBinding BorderThickness}"
        SnapsToDevicePixels="True">
    <Border.Background>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
            <GradientStop Offset="0" Color="#AAFFFF" />
            <GradientStop Offset="1" Color="#AAFFD4" />
        </LinearGradientBrush>
    </Border.Background>

<Border x:Name="DGR_Border"
        BorderBrush="{TemplateBinding Background}"
        BorderThickness="{TemplateBinding BorderThickness}"
        SnapsToDevicePixels="True"
        Background="{TemplateBinding Background}">

并注释掉你的

<!--<VisualStateManager.VisualStateGroups>
    ...
</VisualStateManager.VisualStateGroups>-->

在您的 DataGridRow ControlTemplate 中。