WPF DataGrid - 插入到datagrid时突出显示新行

JPP*_*mer 6 triggers storyboard wpfdatagrid coloranimation

我有一个绑定到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>
Run Code Online (Sandbox Code Playgroud)

方法2:我在视图模型中创建了一个bool,当新项添加到ObservableCollection时,该模型被设置为true.然后我在触发器中检查这个值,如果是真的,我会触发故事板.我不能让它正常工作,并且当我运行它时应用程序会出错.此外,一旦故事板运行,我无法找到将此值设置为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>
Run Code Online (Sandbox Code Playgroud)

方法3:我尝试在将新项添加到可观察集合时在视图模型中设置时间戳字段.然后在XAML中我希望能够将该时间戳与当前时间进行比较,如果匹配则我将触发该事件.我甚至有另一个包含当前时间的字段,并由INotifyPropertyChanged自动更新,但我似乎无法找到一种方法来比较新行的时间戳与包含当前时间的字段.

我觉得必须有一个解决方案,但在度过了令人沮丧的一天后,我想要解决这个问题,我希望有人能够解决这个问题.

JPP*_*mer 7

在处理另一个问题时,我找到了一些帮助我解决这个问题的方法.方法1中的解决方案非常接近,这只是解决看似随机的其他行也会在看似随机的时间突出显示的问题.问题是容器回收(此问题中的更多信息:WPF Toolkit DataGrid复选框问题).

无论如何,我所要做的就是将以下标记添加到我的数据网格中:

VirtualizingStackPanel.VirtualizationMode="Standard"
Run Code Online (Sandbox Code Playgroud)

然后我使用与方法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>
Run Code Online (Sandbox Code Playgroud)

现在,我可以在插入数据网格时突出显示新行.很有用!