在DataContext更改时删除/停止Storyboard

时间:2010-03-03 08:00:10

标签: wpf datacontext triggers storyboard

常规上下文:MVVM应用程序。

我有一个名为JobView的视图。它的DataContext是一个名为Job的类。在Job中是一个名为AuthorizationNeeded的属性。

视图中的边框具有样式(来自资源字典),该样式具有数据触发器,可根据绑定属性AuthorizationNeeded启动和停止故事板。

<Style x:Key="AuthorizationNeededBorder"
       TargetType="Border">
    <Setter Property="Background"
            Value="Yellow" />
    <Setter Property="Opacity"
            Value="0" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding AuthorizationNeeded, FallbackValue=False}"
                     Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Name="Flash"
                                 Storyboard="{StaticResource OneSecondOpacityFlash}" />
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="Flash" />
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

一切都按预期工作。更改AuthorizationNeeded的值会在移至true时启动Storyboard flash,并在移至false时删除(并停止)storyboard。

但是,如果我在故事板运行时将JobView的DataContext更改为其他ViewModel(不同的Job),即使新作业中AuthorizationNeeded的值为false,故事板也会继续运行。

数据触发器没有看到AuthorizationNeeded的值更改为true - &gt;在DataContext更改期间返回false。

关于如何获得AuthorizationNeed = true = storboard运行到AuthorizationNeeded = false =故事板未在所有情况下运行的所需行为的任​​何想法将不胜感激。 (我不希望在DataContext更改时手动更改AuthorizationNeeded的值,因为实际上此视图上有许多此类触发器...)

1 个答案:

答案 0 :(得分:0)

我会考虑在对象的DataContextChanged事件中添加触发器。类似的东西:

<Style.Triggers>
    <EventTrigger EventName="DataContextChanged">
        <StopStoryboard Storyboard="{StaticResource OneSecondOpacityFlash}" />
    </EventTrigger>
</Style.Triggers>

我想知道,如果你想在现有的视图对象上更改DataContext,或者最好创建一个绑定到新DataContext的新视图。根据你正在做的事情,我认为交换DataContexts可能会导致持有额外的句柄。根据容器的不同,删除和重新创建子视图/视图模型可能比交换更容易。