【问题标题】:Storyboard inside of a DataTrigger not triggering more than once on RaisePropertyChanged eventDataTrigger 内的情节提要不会在 RaisePropertyChanged 事件上多次触发
【发布时间】:2012-06-22 18:39:27
【问题描述】:

我正在使用 MVVM 模型。

我有一个依赖属性,一个布尔值,称为“ResultOfUpdate”。每当用户尝试运行命令时,它都会更改。

在此依赖属性的设置器中,我在属性名称上调用“RaisePropertyChanged()”方法。

它像这样绑定到DataTrigger

<DataTrigger Binding="{Binding ResultOfUpdate}"  Value="True">
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Opacity)" 
                                               AutoReverse="True">
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0"  Value="0"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.1"  Value="0.1"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.2" Value="0.2"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="0.3"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.4" Value="0.4"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="0.5"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.6"  Value="0.6"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.7" Value="0.7"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.8" Value="0.8"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.9" Value="0.9"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.1" Value="1"/>
                    <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
</DataTrigger>

...

 <TextBlock Style="{StaticResource statusStyle}"  
            Opacity="0" Text="Results updated!"      
            FontSize="10" FontFamily="Segoe UI"/>

我希望每次将 bool 设置为 true 时,都会播放故事板。

令人困惑的是,这个情节提要在用户第一次运行命令时被正确触发,将依赖属性更新为 true。

后续尝试发现输入了依赖属性setter代码,调用了RaisePropertyChanged()方法——但是没有再播放storyboard。

我在这里做错了什么?

【问题讨论】:

  • 更新了问题,因为之前关于构造函数的行为是因为我在构造函数中留下了一个方法!
  • 是否已将该值重新设置为 false,以便对更改做出反应?否则,只是不断地将属性设置为“真”,我认为不会获得您想要的效果。
  • 不幸的是,我还希望让属性在设置为 false 时做出反应。我曾想过使用枚举来解决这个问题,但不值得付出努力(这似乎很难!)。是否可以将其设置为 null 或类似的东西?
  • 我有 2 个问题。为什么你需要 RaisePropertyChanged() 依赖属性?为什么你的关键时间“0:0:0.1”和“0:0:0.3”有两次不同的值?
  • RaisePropertyChanged 是通知视图值已经更新。故事板是在 Blend 中生成的。

标签: c# wpf xaml mvvm properties


【解决方案1】:

您可以使用这样的事件触发器:

<StackPanel>
    <TextBlock Text="I'm a text block" Name="theTextBlock"/>
    <Button Name="BeginButton">Begin</Button>
    <StackPanel.Triggers>
        <EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton">
            <BeginStoryboard Name="MyBeginStoryboard">
                <Storyboard>
                    <DoubleAnimation
                        Storyboard.TargetName="theTextBlock"
                        Storyboard.TargetProperty="(TextBlock.Opacity)"
                        From="0.0" To="1.0" AutoReverse="True" Duration="0:0:1"/>
                    </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </StackPanel.Triggers>
</StackPanel>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2011-09-15
    • 2019-04-25
    • 2013-11-13
    • 2012-11-08
    • 2017-10-28
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多