WPF故事板触发属性已更改

时间:2009-03-09 15:32:26

标签: wpf triggers storyboard

我有一个DataTemplate,用于实现INotifyPropertyChanged的类。是否有任何方法可以在属性更改时触发故事板,并在不同的值上触发不同的故事板(在这种情况下它是bool)?

有没有办法在启动时触发故事板,具体取决于为数据模板制作的类的值?

2 个答案:

答案 0 :(得分:6)

是的,你可以这样做。

添加DataTrigger并绑定到相应的属性。这是一个例子:

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
        <BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
    </DataTrigger>
</DataTemplate.Triggers>

您可以将值设置为测试为您想要的任何内容。因此,您可以将故事板设置为在值变为false时开始。您可以根据需要添加任意数量的DataTriggers(或其他触发器)。

请注意,在我的示例中,我引用了一个虚拟属性和故事板。

当属性发生变化时,绑定将会更新并因为数据绑定而触发触发器。

此技术也应该在启动时起作用。

答案 1 :(得分:1)

与上面的海报类似,我还使用了DataTrigger,然后将其绑定到我的ViewModel中的属性。我发现令人困惑的一件事是放置数据触发器的位置。我把它直接放在根节点(即Window)中。我使用Expression Blend创建它,它为我处理标签命名细节。

还要确保在项目中包含对“Microsoft.Expression.Interactions”

的引用

XAML :(这直接在根节点中)

<Window
   xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
   xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
   x:Name="window" >

    ...

    <i:Interaction.Triggers>
      <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON">
        <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"     
                                                ControlStoryboardOption="Play"/>
      </ei:DataTrigger>
    </i:Interaction.Triggers>

    ...
</Window>

视图模型:

 private void TurnOnFlashingBackround()
    {
        FlashingBackground = "ON";
    }

    private string _FlashingBackround = "OFF";

    public string FlashingBackground
    {
        get { return _FlashingBackround; }

        private set
        {
            if (FlashingBackground == value)
            {
                return;
            }

            _FlashingBackround = value;
            this.OnPropertyChanged("FlashingBackground");
        }
    }

    public new event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

最后,Viewmodel必须继承“INotifyPropertyChanged”