2016-06-27 3 views
0

У меня есть datagrid, где строки МОГУТ иметь статус, у которого есть цветовой код или данные, которые требуют, чтобы они были выделены полужирным. Мне удалось легко заставить смелый работать. Если у него есть цветовой код, я хочу, чтобы весь фон строки отображался в этом цвете. Я просмотрел несколько сайтов и попробовал много разных способов получить кодировку цвета строки, но никто из них, похоже, не работает. Что мне не хватает?
Datagrid.xaml (стиль):WPF DataGrid Row Coloring

<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 рекомендуется применять только одно свойство, иначе вы можете получить неожиданное поведение. Мое предположение, почему смелые работы и раскраска не происходит, потому что, хотя вы установили оба кода позади, вы также установили цвет фона в стиле.

Остается ли проблема при удалении сеттера в вашем стиле?

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

EDIT

Похоже, вы не можете назначить цвета фона в коде позади, потому что вы не реализовали свойство фона в шаблоне.

prop="{TemplateBinding Background}" 

Копаем немного глубже, оказывается, вы также устанавливаете фон три раза в своем коде.

  1. Фиктивная линия вы Allready удалены
  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.

+0

Я удалил его, и он все еще не работает. –

+0

@ KathrynSimmons Обновлен мой ответ. – Funk

+0

Работал, как только я его вытащил! Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^