我有一个DataTemplate,用于实现INotifyPropertyChanged的类。是否有任何方法可以在属性更改时触发故事板,并在不同的值上触发不同的故事板(在这种情况下它是bool)?
有没有办法在启动时触发故事板,具体取决于为数据模板制作的类的值?
答案 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”