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

时间:2011-12-08 01:20:18

标签: triggers wpfdatagrid storyboard 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>

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

答案 0 :(得分:6)

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

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

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>

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