2010-11-10 55 views
2

使用GoToStateAction後續XAML是一個對象,我試圖建立在Expression Blend。我有與DataTrigger在StackPanel中的麻煩 - 該應用程序不會去當觸發的數據相匹配。進一步的解釋是這樣的代碼之後:DataTrigger是不是在Silverlight

<DataTemplate x:Key="SampleTemplate"> 
    <StackPanel x:Name="SampleStack" Style="{StaticResource DefaultSampleStyle}" Width="64" Height="60"> 
    <VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="VisualStateGroup"> 
     <VisualStateGroup.Transitions> 
     <VisualTransition GeneratedDuration="0"> 
     <Storyboard> 
     <ColorAnimation Duration="0" To="#FFDFE04B" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/> 
     </Storyboard> 
     </VisualTransition> 
     </VisualStateGroup.Transitions> 
     <VisualState x:Name="Empty"> 
     <Storyboard> 
     <ColorAnimation Duration="0" To="#FF4B6FE0" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/> 
     </Storyboard> 
     </VisualState> 
    </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <VisualStateManager.CustomVisualStateManager> 
    <ei:ExtendedVisualStateManager/> 
    </VisualStateManager.CustomVisualStateManager> 
    <i:Interaction.Triggers> 
    <ei:DataTrigger Binding="{Binding IsActive}" Value="False"> 
     <ei:GoToStateAction StateName="Empty" UseTransitions="False"/> 
    </ei:DataTrigger> 
    </i:Interaction.Triggers> 
    <TextBlock x:Name="StartOn" Text="{Binding StartOn, StringFormat=hh:mm}"/><TextBlock x:Name="textBlock" Text="-" />  
    <TextBlock x:Name="EndOn" Text="{Binding EndOn, StringFormat=hh:mm}"/> 
    </StackPanel> 
    </DataTemplate> 

如果我使用一個EventTrigger加載值時,狀態被正確地施加有以IsActive結合。 如果我使用現有的DataTrigger並根據IsActive的綁定更改堆棧面板上的屬性(如Height),這也適用。

我在做XAML的根本錯誤嗎?你需要一個更完整的XAML例子來理解這個問題嗎?

回答

7

你需要的GoToStateAction?

我想,問題是綁定「在啓動」。我添加了一個調度程序,並在一秒後再次拋出NotifyPropertyChanged。然後它工作。顯然,你可以像這樣解決這個問題。您等待控件加載完畢,然後再次拋出PropertyChanged。這不是一個好方法和類似於你的想法(如果我用一個加載值的EventTrigger,...)

我建議你使用DataStateBehaviour。如果你有一個布爾值來決定你必須去哪個坐墊,這很好。這是一種行爲,您可以將條件綁定到屬性,然後設置true和false狀態。

它應該是這樣的(我沒有在我的電腦只是用於測試一些調整):

<DataTemplate x:Key="SampleTemplate"> 
      <StackPanel x:Name="SampleStack" Width="64" Height="60" Background="White"> 
       <i:Interaction.Behaviors> 
        <ei:DataStateBehavior Binding="{Binding IsChecked}" Value="True" TrueState="Empty" FalseState="Base"/> 
       </i:Interaction.Behaviors> 
       <VisualStateManager.VisualStateGroups> 
        <VisualStateGroup x:Name="VisualStateGroup"> 
         <VisualStateGroup.Transitions> 
          <VisualTransition GeneratedDuration="0"/> 
         </VisualStateGroup.Transitions> 
         <VisualState x:Name="Empty"> 
          <Storyboard> 
           <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="Base"/> 
        </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <VisualStateManager.CustomVisualStateManager> 
        <ei:ExtendedVisualStateManager/> 
       </VisualStateManager.CustomVisualStateManager> 
       <TextBlock x:Name="StartOn" Text="Test"/> 
      </StackPanel> 
     </DataTemplate> 

正如你可以看到我添加了第二個狀態到VisualStateGroup(現在有空和底座) 。我建議這不僅僅是因爲DataStateBehaviour在一個組中至少需要兩個狀態。如果你只有一個狀態,你就沒有機會改變這個組的狀態回到正常狀態,例如,

我希望這個答案可以幫助你。

BR,

TJ