有没有办法将绑定分配给值而不是绑定XAML中的值?

时间:2012-09-06 21:32:02

标签: wpf xaml binding storyboard

所以,假设我想以动态方式修改几个视觉元素的DataContext,并且我想将其作为Storyboard的一部分来修改。我可能这样做:

<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保持绑定?

1 个答案:

答案 0 :(得分:3)

想象一下,您有以下代码:

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

人们应该注意到这里有两个问题。

  1. 每个故事板都必须维护此绑定。
  2. 实际运行此Storyboard时, Foo 的当前值将设置为 SomeProperty Foo 中的后期更改不会受到影响。
  3. 我建议如下。使用Foo作为依赖项属性创建一些依赖项对象。例如:

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

    在Storyboard中使用此容器。

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

    修改Control的ContentTemplate,以便绑定到Foo属性本身。因此,您可以将绑定而不是直接传输到Control。故事板也不会受到Foo值变化的影响。