2010-11-10 4 views
2

Le code XAML suivant représente un objet que j'essaie de générer dans Expression Blend. J'ai des problèmes avec DataTrigger dans le StackPanel - l'application ne va pas à Vide lorsque le déclencheur correspond aux données. Des explications plus détaillées est après ce code:DataTrigger n'utilise pas GoToStateAction dans 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> 

Si j'utilise un EventTrigger avec un chargé valeur, le vide état est correctement appliqué sur la base du IsActive obligatoire. Si j'utilise le DataTrigger existant et que vous modifiez une propriété sur le Stackpanel, telle que Height, en fonction de la liaison de IsActive cela fonctionne également. Est-ce que je fais quelque chose de fondamentalement faux dans le XAML? Avez-vous besoin d'un exemple plus complet de XAML pour comprendre le problème?

Répondre

7

avez-vous besoin du GoToStateAction?

Je suppose que le problème est la liaison "au démarrage". J'ai ajouté un répartiteur et j'ai relancé NotifyPropertyChanged après une seconde. Alors ça marche. Propably vous pouvez le contourner comme ça. Vous attendez que le contrôle soit chargé, puis relancez PropertyChanged. Ce n'est pas un bon moyen et similaire à votre idée (Si j'utilise un EventTrigger avec une valeur Loaded, ...)

Je vous recommande d'utiliser un DataStateBehaviour. Si vous avez un booléen pour décider à quel moment vous devez aller, c'est génial. C'est un comportement où vous pouvez lier la condition à une propriété et ensuite définir un vrai et un faux état.

Il ressemblerait à ceci (je l'ai fait quelques ajustements seulement pour les tests à mon ordinateur):

<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> 

Comme vous pouvez le voir, j'ajouté un second état au VisualStateGroup (Il est maintenant vide et base) . Je recommanderais ceci non seulement parce que le DataStateBehaviour a besoin d'au moins deux états dans un groupe. Si vous n'avez qu'un seul état, vous n'avez aucune chance de revenir à l'état normal de ce groupe, par exemple.

J'espère que cette réponse vous aide.

BR,

TJ