2016-06-27 97 views
0

我有一个datagrid,其中的行可能有一个状态,其颜色代码或数据要求它们加粗。我已经能够轻松地使胆量工作。如果它具有颜色代码,我希望整个行背景以该颜色显示。我搜索了几个网站,并尝试了许多不同的方式来获得行颜色编码,但它们都不起作用。我错过了什么?
Datagrid.xaml(风格):WPF DataGrid行着色

<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; 
    } 
} 
+0

您发布了太多的代码,可能会使想要回答您的问题的人感到困惑。 请尝试简要解释您的问题。 – ViVi

回答

0

在WPF中,最好只设置一次属性,否则会出现意想不到的行为。我的猜测为什么大胆的作品和着色不是因为虽然你已经在后面的代码中设置,你也已经在Style中设置了背景颜色。

当您在样式中移除setter时,问题仍然存在吗?

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

编辑

看起来你无法分配代码的背景颜色的背后,是因为你还没有实现在模板的背景属性。

prop="{TemplateBinding Background}" 

挖得更深一点,结果证明你也在代码中设置了三次背景。

  1. 行背景,通过模板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

  • +0

    我删除它,它仍然无法正常工作。 –

    +0

    @KathrynSimmons更新了我的答案。 – Funk

    +0

    我一拿出就工作!谢谢! –