2

それで、いくつかのビジュアル要素の DataContext を動的に変更したいとしましょう。それをストーリーボードの一部として行いたいとします。私はそうするかもしれません:

<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 と KeyFrame があります。たとえば、GeneratedThings オブジェクト (コレクションの個々の要素ではありません) を更新すると、KeyFrame の数に比例してパフォーマンスが低下することがわかります。

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>

ここで 2 つの問題に気付くはずです。

  1. すべての Storyboard は、この Binding を維持する必要があります。
  2. この Storyboard を実際に実行すると、 Fooの現在の値はSomePropertyに設定されます。Fooの後の変更は影響を受けません。

以下を提案します。依存関係プロパティとして 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 に答える