如何:在Silverlight 4中为MVVM ViewModel属性设置动画?

时间:2011-04-18 23:38:10

标签: silverlight-4.0 mvvm

我想问一下,如果可能的话,你如何在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视图模型属性的任务,而无需在代码隐藏中添加代码?

1 个答案:

答案 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。