[英]Change MVVM property from storyboard in XAML, after animation completes
我将不同的用户控件定义为ListView的ItemSource DataTemplates,它们都共享一个ViewModel:
<UserControl>
<Grid>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding MyAwesomeProperty}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation>
some awesome animation
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
public class AwesomeViewModel : ViewModelBase
{
private bool myAwesomeProperty= false;
public bool MyAwesomeProperty
{
get { return myAwesomeProperty; }
set
{
if (myAwesomeProperty!= value)
{
myAwesomeProperty= value;
RaisePropertyChanged(() => MyAwesomeProperty);
}
}
}
}
现在,我想在MyAwesomeProperty更改为true时开始动画。 这是由DataTrigger完成的。 但是,一旦动画完成,我想将MyAwesomeProperty的值设置回false。
由于此逻辑由具有相同ViewModel的多个UserControl共享,因此我需要纯MVVM解决方案,而在背后的代码中没有Animation.Completed回调。 这可能吗?
这是使用Blend的交互库的解决方案
首先,右键单击项目中的“ 引用” ,单击“ 添加引用”,然后在“ 框架”下添加Microsoft.Expressions.Interaction
和System.Windows.Interactivity
。
之后,将以下引用添加到XAML文件的顶部:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
然后,您可以执行以下操作:
<Grid>
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding MyAwesomeProperty}" Value="True">
<ei:ControlStoryboardAction Storyboard="{StaticResource YourAwesomeStoryboard}" ControlStoryboardOption="Play"/>
<ei:ChangePropertyAction PropertyName="{Binding MyAwesomeProperty}" Value="False"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
</Grid>
如果没有代码,则根本无法实现。 我建议您从代码背后在ViewModel上触发一个Command来处理逻辑。 这样,您就不会违反MVVM模式。
我可以看到的一个立即解决方案是,通过背后的代码启动情节提要并订阅情节提要完成事件。 您可以使用以下代码启动情节提要:
Storyboard storyBoard = (Storyboard)this.Resources["YourStoryBoard"];
storyBoard.Begin();
然后订阅其活动
storyboard.Completed += storyboard_Completed;
void storyboard_Completed(object sender, System.EventArgs e)
{
// your code here
}
希望这对您有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.