WPF DataGrid - подсвечивать новые строки при вставке в сетку данных - PullRequest
5 голосов
/ 08 декабря 2011

У меня есть сетка данных, связанная с ObservableCollection, и я хотел бы выделить новые строки, когда они добавляются в сетку данных (т. Е. Когда новый объект вставляется в ObservableCollection). Я хотел бы выделить строки, когда они вставляются, сначала изменив цвет фона, но затем со временем цвет снова становится нормальным. Я пробовал разные методы, чтобы заставить его работать, но ничего не работает должным образом.

Метод 1: у меня есть триггер события, который срабатывает при загрузке столбца. Он срабатывает при загрузке элемента, но кажется, что он срабатывает почти случайно и в других старых строках (в тех строках, в которых он уже был запущен один раз, когда строка была новой).

<DataGridHyperlinkColumn x:Name="OrderID" Binding="{Binding OrderNumber}" Header="Order" SortMemberPath="ciOrderId">
    <DataGridHyperlinkColumn.ElementStyle>                                
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Transparent"/>
            <EventSetter Event="Hyperlink.Click" Handler="OrderNumber_Click" />
            <Style.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation 
                                            Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)" 
                                            Duration="00:00:03" 
                                            From="Red" To="Transparent" />
                        </Storyboard>                                                
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

Метод 2: Я сделал bool в модели представления, который имеет значение true, когда новый элемент добавляется в ObservableCollection. Затем я проверяю это значение в триггере, и если это правда, я запускаю раскадровку. Я не могу заставить это работать должным образом, хотя, и приложение продолжает выдавать ошибку, когда я запускаю это. Кроме того, я не могу найти способ установить это значение равным false после запуска раскадровки (я не могу использовать событие Completed раскадровки, потому что DataTrigger в стиле).

<DataTrigger Binding="{Binding isNew}" Value="True">
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <ColorAnimation
                    Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)" 
                    Duration="00:00:03" 
                    From="Red" To="{x:Null}" FillBehavior="Stop"/>
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>

Метод 3: я попытался установить поле метки времени в модели представления, когда новый элемент добавлен в наблюдаемую коллекцию. Затем в XAML я хочу иметь возможность сравнить эту временную метку с текущим временем, и, если она совпадет, я запусту событие. У меня даже есть другое поле, которое содержит текущее время и автоматически обновляется INotifyPropertyChanged, но я не могу найти способ сравнить метку времени новой строки с полем, содержащим текущее время.

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

1 Ответ

6 голосов
/ 11 января 2012

Работая над другой проблемой, я нашел кое-что, что помогло мне решить эту проблему.Решение в методе 1 очень близко, это был только вопрос решения проблемы, казалось бы, случайных других строк, которые также выделяются в кажущееся случайное время.Проблема заключалась в переработке контейнера (дополнительная информация в этом вопросе: Проблемы с флажком DataFrid из набора инструментов WPF ).

В любом случае все, что мне нужно было сделать, это добавить следующий тег в мою сетку данных:

VirtualizingStackPanel.VirtualizationMode="Standard"

И затем я использовал тот же триггер, что и в методе 1:

<DataGridHyperlinkColumn x:Name="OrderID" Binding="{Binding OrderNumber}" 
        Header="Order" SortMemberPath="ciOrderId">
    <DataGridHyperlinkColumn.ElementStyle>                                
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Transparent"/>
            <EventSetter Event="Hyperlink.Click" Handler="OrderNumber_Click" />
            <Style.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation 
                                Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)" 
                                Duration="00:00:03" 
                                From="Red" To="Transparent" />
                        </Storyboard>                                                
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

Теперь я могу выделять новые строки, когда они вставляются в мою сетку данных.Очень полезно!

...