Подсветка ячеек в WPF DataGrid при изменении связанного значения

У меня есть DataGrid, данные которого обновляются фоновым процессом каждые 15 секунд. Если какие-либо данные изменяются, я хочу запустить анимацию, которая выделяет ячейку с измененным значением желтым цветом, а затем снова становится белым. Я вроде как заработал следующим образом:

Я создал стиль с триггером события для Binding.TargetUpdated

<Style x:Key="ChangedCellStyle" TargetType="DataGridCell">
    <Style.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Duration="00:00:15"
                        Storyboard.TargetProperty=
                            "(DataGridCell.Background).(SolidColorBrush.Color)" 
                        From="Yellow" To="Transparent" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

А затем применил его к столбцам, которые хотел выделить при изменении значения

<DataGridTextColumn Header="Status" 
    Binding="{Binding Path=Status, NotifyOnTargetUpdated=True}" 
    CellStyle="{StaticResource ChangedCellStyle}" />

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

Во-первых, при первоначальной загрузке сетки данных весь столбец выделяется желтым цветом. Это имеет смысл, потому что все значения загружаются в первый раз, поэтому вы ожидаете, что TargetUpdated сработает. Я уверен, что есть способ остановить это, но это относительно второстепенный вопрос.

Настоящая проблема заключается в том, что весь столбец выделяется желтым цветом, если сетка каким-либо образом отсортирована или отфильтрована. Думаю, я не понимаю, почему сортировка может вызвать срабатывание TargetUpdated, поскольку данные не изменились, а только так, как они отображаются.

Итак, мой вопрос: (1) как я могу остановить это поведение при начальной загрузке и сортировке/фильтрации, и (2) на правильном ли я пути, и это вообще хороший способ сделать это? Я должен упомянуть, что это MVVM.

13
задан Phil 1 June 2012 в 17:58
поделиться