1

一般上下文: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 时启动情节提要闪烁,并在移至 false 时移除(并停止)情节提要。

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

在 DataContext 更改期间,数据触发器没有看到 AuthorizationNeeded true -> false 的值变化。

任何关于我如何达到 AuthorizationNeed = true = storboard 运行到 AuthorizationNeeded = false = 故事板在所有情况下都没有运行的期望行为的任何想法都将不胜感激。(我不希望在 DataContext 更改时手动更改 AuthorizationNeeded 的值,因为实际上这个视图上有很多这样的触发器......)

4

1 回答 1

0

我会考虑DataContextChanged为对象上的事件添加触发器。就像是:

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

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

于 2010-03-03T19:09:02.770 回答