WPF故事板:属性更改触发器

4

我有一个适用于实现了INotifyPropertyChanged接口的类的DataTemplate。是否有办法在属性更改时触发Storyboard,并在不同的值(这种情况下是bool型)上触发不同的Storyboard?

还有一种方法可以根据数据模板所创建的类中的值,在启动时触发一个Storyboard吗?

2个回答

8

是的,你可以这样做。

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

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

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

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

当属性更改时,绑定将更新并由于数据绑定而触发触发器。

此技术在启动时也应该有效。


即使在列表框获取对象时所有值都已设置,这是否仍然有效? - Peter
1
我相信当对象被获取时,故事板会被触发。试一下就知道了。 - Josh G
2
我们在 XAML 的哪里添加这个? - swinefeaster
1
@swinefeaster:可以在DataTemplate的任何位置。根据原帖作者的说法,他已经在DataTemplate中工作了。DataTemplate被定义为资源,可以在某些组件内部本地定义,也可以在UserControl的顶部定义。 - Josh G
2
“<BeginStoryboard..”元素不能在“<DataTrigger...”元素中被接受:类型为“BeginStoryboard”的值无法分配给类型为“SetterBaseCollection”的集合或字典。为什么会这样? - Nicolas

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"。


2
实际上,这个例子使用了Blend触发器,它们与内置的WPF触发器非常不同。然而它们的名称相同,只是命名空间不同。从某种意义上说,我想Blend触发器可以被认为是“附加”的触发器,而内置的触发器则有非常具体的放置规则。 - Alex Paven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接