【问题标题】:Remove/Stop Storyboard on DataContext change在 DataContext 更改时删除/停止情节提要
【发布时间】:2011-01-23 02:19:44
【问题描述】:

一般上下文: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 的值,因为实际上这个视图上有很多这样的触发器......)

【问题讨论】:

    标签: wpf datacontext triggers storyboard


    【解决方案1】:

    我会考虑为对象上的DataContextChanged 事件添加一个触发器。比如:

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

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

    【讨论】:

    • Ben,非常感谢您的回复……对于我对您的回复缓慢,我深表歉意。该项目的其他方面在那里接管了一段时间。不幸的是,我无法让 DataContextChanged 事件起作用,但确实听取了您对 v/vm 结构的建议。尽管我很小心地释放句柄(并跟踪它们以确认),但这并不是一种好的操作模式。因此,根据您的建议,我更改了结构以发布 v/vms 并在需要时创建干净的副本。再次 - 非常感谢您花时间回答。
    • 嗯,很高兴我能提供帮助!正如您所说,即使小心结构等,您基本上最终还是构建了一个引用计数实现,这给系统增加了很多开销。祝你好运!
    猜你喜欢
    • 2011-01-01
    • 2019-12-29
    • 2015-01-26
    • 2020-08-06
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多