常规上下文: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的值,因为实际上此视图上有许多此类触发器...)
答案 0 :(得分:0)
我会考虑在对象的DataContextChanged
事件中添加触发器。类似的东西:
<Style.Triggers>
<EventTrigger EventName="DataContextChanged">
<StopStoryboard Storyboard="{StaticResource OneSecondOpacityFlash}" />
</EventTrigger>
</Style.Triggers>
我想知道,如果你想在现有的视图对象上更改DataContext,或者最好创建一个绑定到新DataContext的新视图。根据你正在做的事情,我认为交换DataContexts可能会导致持有额外的句柄。根据容器的不同,删除和重新创建子视图/视图模型可能比交换更容易。