我创建了一个DataGridCell模板,我已将其应用于我的一个列,如下所示:
<DataGridTextColumn Binding="{Binding LastUpdated}"
IsReadOnly="True" CanUserReorder="False"
CanUserSort="False" CanUserResize="False"
CellStyle="{StaticResource DataGridCellStyle1}"
/>
模板看起来像这样:
<ControlTemplate TargetType="{x:Type DataGridCell}">
<ControlTemplate.Resources>
<Storyboard x:Key="CellChangedStoryboard">
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="DGC_Border">
<EasingColorKeyFrame KeyTime="0" Value="LightGreen"/>
<EasingColorKeyFrame KeyTime="0:0:8" Value="Red"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border x:Name="DGC_Border" Background="Red">
<ContentPresenter />
<i:Interaction.Triggers>
<ei:TimerTrigger MillisecondsPerTick="1000" >
<ei:ControlStoryboardAction Storyboard="{StaticResource CellChangedStoryboard}"/>
</ei:TimerTrigger>
</i:Interaction.Triggers>
</Border>
</ControlTemplate>
在这个例子中,我使用Blend TimerTrigger触发动画,但是无论我如何触发动画,一旦我尝试对DataGrid进行排序(通过单击其中一个列标题),它总会崩溃
如果我删除了故事板,那么它就不会在排序时崩溃。
异常是 InvalidOperationException:在'System.Windows.Controls.Border'的名称范围内找不到'DGC_Border'名称。
我怀疑当DataGrid对其进行排序时会破坏或以其他方式混乱单元格/列,并且正在运行的动画无法再找到动画的单元格。
为什么会发生异常,如何阻止它? 感谢
更新:似乎工作正常如果我使用<ControlTemplate.Triggers>
来触发StoryBoard。不幸的是,这不是解决方案,因为当绑定属性发生变化时我需要播放故事板。
答案 0 :(得分:0)
我能想出的最好的方法是放弃Blend触发器并使用它:
<Border x:Name="DGC_Border" Background="Red">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Content="{Binding LastUpdated, NotifyOnTargetUpdated=True}">
<ContentPresenter.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard Storyboard="{StaticResource RowChangedStoryboard}" />
</EventTrigger>
</ContentPresenter.Triggers>
</ContentPresenter>
</Border>
我注意到在网格排序之后所有的动画都被移除了,这对我来说不是正确的行为 - 我希望动画从他们中断的地方继续,但是我必须将它保存到另一天。