2012-09-06 30 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值變化的影響。

相關問題