2

因此,假设我想以动态方式修改多个可视元素的 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 维护绑定?

4

1 回答 1

3

假设您有以下代码:

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

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

  1. 每个 Storyboard 都必须维护这个 Binding。
  2. 在运行这个 Storyboard 时,实际上Foo的当前值将设置为SomePropertyFoo的后续更改不会受到影响。

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

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

在情节提要中使用此容器。

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

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

于 2014-11-12T13:38:51.290 回答