我想问一下,如果可能的话,你如何在Silverlight中的MVVM视图模型上设置属性动画。例如,这里我在XAML中有一个典型的Storyboard声明:
<DoubleAnimation
Storyboard.TargetName="yearSlider"
Storyboard.TargetProperty="Value"
From="1990" To="2012" Duration="0:0:8" />
现在假设不是在Slider yearSlider上设置Value属性的动画,而是想在我的MVVM视图模型上设置CLR(非依赖)属性“Year”的动画。例如,如果我的viewmodel设置为DataContext,则代码可能假设如下:
<DoubleAnimation
Storyboard.BindingSource="{Binding}"
Storyboard.TargetProperty="Year"
From="1990" To="2012" Duration="0:0:8" />
当然,Storyboard上没有这样的“BindingSource”属性,但这应该有助于说明我正在尝试做什么。
Silverlight 4中是否有任何机制可以完成动画MVVM视图模型属性的任务,而无需在代码隐藏中添加代码?
答案 0 :(得分:4)
是。你可以这样做。
MVVM中的属性必须是依赖项属性,而不是普通属性。因此,您的MVVM必须从DependencyObject继承,然后您可以创建可以设置动画的依赖项属性。
public class MyViewModel : DependencyObject
{
public static readonly DependencyProperty YearProperty =
DependencyProperty.Register(
"Year", typeof(int),
typeof(MyViewModel), null
);
public int Year
{
get { return (int)GetValue(YearProperty); }
set { SetValue(YearProperty, value); }
}
}
然后你的XAML看起来像这样:
<DoubleAnimation
Storyboard.Target="{Binding}"
Storyboard.TargetProperty="Year"
From="1990" To="2012" Duration="0:0:8" />
尝试一下,让我知道它是否有效。
如果没有,尝试摆弄它,直到你弄清楚如何满足DoubleAnimation的绑定。也许你可以在范围内捎带另一个元素:
<TextBlock x:Name="YearLabel" Text="{Binding Year}" />
<DoubleAnimation
Storyboard.TargetName="YearLabel"
Storyboard.TargetProperty="DataContext.Year"
From="1990" To="2012" Duration="0:0:8" />
注意我们如何修改“DataContext.Year”。它不必是TextBlock。可以是任何具有名称的元素...例如RootLayout Grid。