2012-09-06 28 views
2

因此,假设我想以动态方式修改多个视觉元素的DataContext,并且我想这样做是作为Storyboard的一部分。我可以做到这一点,像这样:有没有办法将一个绑定分配给一个值,而不是绑定XAML中的值?

<Storyboard> 
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SomeVisualElement" Storyboard.TargetProperty="(FrameworkElement.DataContext)" Duration="0:0:0" > 
     <DiscreteObjectKeyFrame KeyTime="0:0:0" > 
      <DiscreteObjectKeyFrame.Value> 
       <Binding Path="Repository.GeneratedThings[0].Element" /> 
      </DiscreteObjectKeyFrame.Value> 
     </DiscreteObjectKeyFrame> 
    </ObjectAnimationUsingKeyFrames> 
</Storyboard> 

这有约束力的DiscreteObjectKeyFrame到Repository.GeneratedThings [0] .Element价值的影响。应用此Storyboard时,SomeVisualElement的DataContext被设置为Repository.GeneratedThings [0] .Element。这相当于,我觉得说的,:

<UserControl x:Name="SomeVisualElement" DataContext="{Binding Path="Repository.GeneratedThings[0].Element"} /> 

这是功能性的,但我想这样做是有一些方法的结合仅维持在视觉元素,但不是在关键帧。我们有很少的视觉元素,但是有许多Storyboard和KeyFrames,当我们更新GeneratedThings对象(而不是集合中的单个元素)时,我们注意到与KeyFrames的数量成正比的性能。

如何设置DiscreteObjectKeyFrame,以便DataContext正确结束绑定,但DiscreteObjectKeyFrame的值未绑定?这是否是一个合理的语义区别WPF/XAML之间的值是一个绑定和一个值绑定?

另外,是否有另一种方法来改变Storyboard内的几个视觉元素的DataContext,并且不涉及让每个Storyboard保持绑定?

回答

3

假设你有下面的代码:

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SomeVisualElement" Storyboard.TargetProperty="SomeProperty" Duration="0:0:0" > 
    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value={Binding Foo} /> 
</ObjectAnimationUsingKeyFrames> 

人们应该注意到此处的两个问题。

  1. 每个故事板都必须保持这种绑定。
  2. 运行此故事板时,实际上当前值Foo将被设置为SomeProperty。后期更改Foo不会受到影响。

我建议如下。用Foo创建一些依赖对象作为依赖属性。例如:

<Grid.Resources> 
    <viewModel:FooContainer Foo={Binding Foo} x:Key="FooContainer" /> 
</Grid.Resources> 

在Storyboard(s)中使用此容器。

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SomeVisualElement" Storyboard.TargetProperty="SomeProperty" Duration="0:0:0" > 
    <DiscreteObjectKeyFrame KeyTime="0:0:0" Value={StaticResource FooContainer} /> 
</ObjectAnimationUsingKeyFrames> 

修改一个控制的ContentTemplate,所以你可以绑定到富物业本身。因此,您可以直接将Foo的绑定而不是的值转移到控件。另外Storyboard不会受到Foo值变化的影响。

相关问题