Выделенные жирным шрифтом измененные ячейки в DataGrid

Я хотел бы выделить жирным шрифтом измененные ячейки DataGrid при обновлении источника данных. Я обнаружил, что <EventTrigger RoutedEvent="Binding.TargetUpdated"> — это событие, которое мне нужно. Однако я не могу заставить Storyboard работать со свойством FontWeight.

Вот что я пытаюсь:

<EventTrigger RoutedEvent="Binding.TargetUpdated">
    <BeginStoryboard>
        <Storyboard>
            <Int32Animation Duration="00:00:05" 
                Storyboard.TargetProperty="(Int32)(DataGridCell.FontWeight)"  
                From="400" To="700" />
        </Storyboard>
    </BeginStoryboard>
</EventTrigger>

Может кто-нибудь порекомендовать, как исправить вышеуказанное или предложить новый, более разумный способ выделения измененных ячеек жирным шрифтом в DataGrid?


person Martin Kulov    schedule 22.10.2012    source источник


Ответы (1)


Это работает для меня...

У меня есть ресурс...

   <Style TargetType="TextBlock" x:Key="ElementStyle">
       <Style.Triggers>
           <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                   <Storyboard>
                      <ObjectAnimationUsingKeyFrames
                          Duration="00:00:01"
                          Storyboard.TargetProperty="(TextElement.FontWeight)">
                             <DiscreteObjectKeyFrame 
                                KeyTime="00:00:00" 
                                Value="{x:Static FontWeights.Thin}" />
                             <DiscreteObjectKeyFrame 
                                KeyTime="00:00:00.5" 
                                Value="{x:Static FontWeights.Heavy}" />
                             <DiscreteObjectKeyFrame 
                                KeyTime="00:00:01" 
                                Value="{x:Static FontWeights.UltraBold}" />
                           </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                     </BeginStoryboard>                                
               </EventTrigger>
         </Style.Triggers>
  </Style>

Назначьте это соответствующему столбцу,

  <toolkit:DataGridTextColumn 
        Binding="{Binding Quantity, NotifyOnTargetUpdated=True}" 
                          ElementStyle="{StaticResource ElementStyle}" />

ИЗМЕНИТЬ

Поскольку приведенный выше код делает значения по умолчанию также жирными, у нас есть другой способ сделать это, при котором ТОЛЬКО обновления, сделанные пользователем, вызовут выделение жирным шрифтом в ячейке.

Стиль

  <Style TargetType="Controls:DataGridCell" 
   BasedOn="{StaticResource {x:Type Controls:DataGridCell}}" 
   x:Key="CellBoldStyle">
<Style.Triggers>
    <EventTrigger RoutedEvent="Binding.SourceUpdated">
    <BeginStoryboard>
        <Storyboard>
        <ObjectAnimationUsingKeyFrames
            Duration="00:00:01"                                 Storyboard.TargetProperty
                                    ="(TextBlock.FontWeight)">
            <DiscreteObjectKeyFrame KeyTime="00:00:00.5" 
                                Value="{x:Static FontWeights.Normal}" />
            <DiscreteObjectKeyFrame KeyTime="00:00:01" 
                                Value="{x:Static FontWeights.Bold}" />
        </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </BeginStoryboard>
    </EventTrigger>
</Style.Triggers>
  </Style>

Столбец

  <Controls:DataGridTextColumn 
             Binding="{Binding Side, Mode=TwoWay, 
                               NotifyOnTargetUpdated=True, 
                               NotifyOnSourceUpdated=True}" 
             CellStyle="{StaticResource CellBoldStyle}" />

Ограничения

  1. Виртуализированные ячейки потеряют выделенный жирным шрифтом эффект, когда вы будете прокручивать их из окна прокрутки.
  2. Даже ваш TextBox показывает значение Bold. (Я не знаю, является ли это ограничением для вас!)
person WPF-it    schedule 22.10.2012
comment
Спасибо чувак! Хотел бы я купить тебе пива! :) Знаете ли вы, есть ли способ предотвратить запуск события TargetUpdated при первой привязке? Моя цель - выделять измененные ячейки жирным шрифтом только при изменении пользователем после начальной загрузки приложения. Спасибо! - person Martin Kulov; 22.10.2012
comment
Привет, мне нужно что-то немного другое, хотя. В моем случае пользователь не редактирует напрямую данные в DataGrid. Все изменения выполняются путем изменения связанных данных программным путем. Первый пример, который вы показываете, отлично работает, однако при начальной загрузке приложения все данные выделяются жирным шрифтом, поскольку цель обновляется. Это событие TargetUpdated, которое мне нужно, однако я не хочу, чтобы оно выполнялось во время первой привязки во время инициализации приложения. - person Martin Kulov; 25.10.2012
comment
К сожалению, простое использование TargetUpdated на основе XAML не поможет, так как это событие сработает, даже когда целевой текстовый блок будет обновлен в первый раз. Я советую использовать прикрепленное поведение в текстовом блоке, чтобы поддерживать flag, которое может стать истинным ТОЛЬКО после того, как первое событие TragetUpdated будет обработано против этого TextBlock, а анимация Bold впредь будет выполняться только в том случае, если флаг истинен. - person WPF-it; 25.10.2012