我有一个适用于实现了INotifyPropertyChanged接口的类的DataTemplate。是否有办法在属性更改时触发Storyboard,并在不同的值(这种情况下是bool型)上触发不同的Storyboard?
还有一种方法可以根据数据模板所创建的类中的值,在启动时触发一个Storyboard吗?
我有一个适用于实现了INotifyPropertyChanged接口的类的DataTemplate。是否有办法在属性更改时触发Storyboard,并在不同的值(这种情况下是bool型)上触发不同的Storyboard?
还有一种方法可以根据数据模板所创建的类中的值,在启动时触发一个Storyboard吗?
是的,你可以这样做。
添加一个DataTrigger并绑定到相应的属性。以下是一个例子:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
<BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
</DataTrigger>
</DataTemplate.Triggers>
您可以将测试值设置为任何您想要的内容。因此,您可以在值更改为false时将storyboard设置为开始。您可以添加任意数量的DataTriggers(或其他触发器)。
请注意,在我的示例中,我引用了一个虚拟属性和storyboard。
当属性更改时,绑定将更新并由于数据绑定而触发触发器。
此技术在启动时也应该有效。
<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"。