2009-03-09 9 views
3

J'ai un DataTemplate qui est pour une classe qui implémente INotifyPropertyChanged. Y at-il un moyen de déclencher un storyboard quand une propriété change et un storyboard différent sur des valeurs différentes (c'est un bool dans ce cas)?WPF Storyboard Trigger sur la propriété a changé

Et est-il possible de déclencher un storyboard au démarrage en fonction des valeurs de la classe pour laquelle le modèle de données est créé?

Répondre

6

Oui, vous pouvez le faire.

Ajouter un DataTrigger et lier à la propriété respective. Voici un exemple:

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=MyProperty}" Value="True"> 
     <BeginStoryboard Storyboard="{StaticResource myStoryboard}"/> 
    </DataTrigger> 
</DataTemplate.Triggers> 

Vous pouvez définir la valeur à tester pour tout ce que vous voulez. Vous pouvez donc définir le storyboard pour qu'il commence lorsque votre valeur passe à false. Vous pouvez ajouter autant de DataTriggers (ou d'autres déclencheurs) que vous le souhaitez.

Notez que dans mon exemple, je référence une propriété et un storyboard factices.

Lorsque la propriété change, la liaison est mise à jour et déclenche le déclencheur en raison de la liaison de données.

Cette technique devrait également fonctionner au démarrage.

+0

cela fonctionnera même si toutes les valeurs sont définies lorsque la listbox obtient l'objet? – Peter

+1

Je crois que le storyboard serait tiré lorsque l'objet est acquis. Essayez-le et voyez. –

+2

Où dans le xaml ajoutons-nous ceci? – swinefeaster

1

De même que pour l'affiche ci-dessus, j'ai également utilisé un DataTrigger, puis je l'ai lié à une propriété dans mon ViewModel. La seule chose que j'ai trouvée confuse était où mettre le déclencheur de données. Je l'ai mis directement dans le nœud racine (c'est-à-dire la fenêtre). Je l'ai créé en utilisant Expression Blend qui a pris soin des détails de nommage de balise pour moi.

Assurez-vous aussi d'inclure dans votre projet une référence à "Microsoft.Expression.Interactions"

XAML: (cela va directement dans le nœud racine)

<Window 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Name="window" > 

    ... 

    <i:Interaction.Triggers> 
     <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON"> 
     <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"  
               ControlStoryboardOption="Play"/> 
     </ei:DataTrigger> 
    </i:Interaction.Triggers> 

    ... 
</Window> 

ViewModel:

private void TurnOnFlashingBackround() 
    { 
     FlashingBackground = "ON"; 
    } 

    private string _FlashingBackround = "OFF"; 

    public string FlashingBackground 
    { 
     get { return _FlashingBackround; } 

     private set 
     { 
      if (FlashingBackground == value) 
      { 
       return; 
      } 

      _FlashingBackround = value; 
      this.OnPropertyChanged("FlashingBackground"); 
     } 
    } 

    public new event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Enfin, le viewmodel doit hériter de « INotifyPropertyChanged »

+2

En fait, cet exemple utilise les déclencheurs Blend, qui sont assez différents des triggers WPF intégrés. Pourtant, ils sont nommés pareil. Juste des espaces de noms différents. Dans un sens, les Blend pourraient être considérés comme des déclencheurs «attachés», je suppose, alors que ceux qui sont intégrés ont des règles très spécifiques sur l'endroit où ils peuvent être placés. –

+0

Plus un pour montrer un exemple complet. – MickyD

Questions connexes