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

Silverlight 4.0 如何:在Silverlight 4中设置MVVM ViewModel属性的动画?,silverlight-4.0,mvvm,Silverlight 4.0,Mvvm,我想问,如果可能的话,如何在Silverlight中为MVVM viewmodel上的属性设置动画。例如,这里我有一个典型的XAML脚本声明: <DoubleAnimation Storyboard.TargetName="yearSlider" Storyboard.TargetProperty="Value" From="1990" To="2012" Durat

我想问,如果可能的话,如何在Silverlight中为MVVM viewmodel上的属性设置动画。例如,这里我有一个典型的XAML脚本声明:

  <DoubleAnimation
                    Storyboard.TargetName="yearSlider"
                    Storyboard.TargetProperty="Value"
                    From="1990" To="2012" Duration="0:0:8" />

现在,假设不在Slider yearSlider上设置Value属性的动画,而是在MVVM viewmodel上设置CLR(非依赖项)属性“Year”的动画。例如,如果将my viewmodel设置为DataContext,则代码可能假设如下所示:

  <DoubleAnimation
                    Storyboard.BindingSource="{Binding}"
                    Storyboard.TargetProperty="Year"
                    From="1990" To="2012" Duration="0:0:8" />

当然,故事板上没有这样的“BindingSource”属性,但这应该有助于说明我正在尝试做什么

Silverlight 4中是否有任何机制可以完成为MVVM viewmodel属性设置动画的任务,而无需在代码隐藏中添加代码?

是。你可以这样做

MVVM中的属性必须是依赖项属性,而不是普通属性。因此,您的MVVM必须从DependencyObject继承,然后您可以创建一个可以设置动画的dependency属性

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”的。它不必是文本块。可以是具有名称的任何元素。。。例如,与RootLayout网格类似。

能否显示XAML的外观,即显示DoubleAnimation声明?设置属性目标时,出现以下错误:错误1 XML命名空间“”中类型“DoubleAnimation”上不存在属性“Target”。添加了另一种绑定方法。动画可能会特别敏感,因此您可能需要尝试不同的技术才能获得实际的视图模型。感谢您提供的信息。我很感激你的尝试,所以我把你的答案投了赞成票。不幸的是,我正在寻找一个优雅的解决方案,它完全按照指定的方式工作,而不是为了实现这一点而四处摆弄或进行涉及绑定到其他UIElement的黑客操作。