2009-03-09 12 views
3

Ich habe eine DataTemplate, die für eine Klasse ist, die INotifyPropertyChanged implementiert. Gibt es eine Möglichkeit, ein Storyboard auszulösen, wenn sich eine Eigenschaft ändert, und ein anderes Storyboard mit anderen Werten (in diesem Fall ein Bool)?WPF Storyboard Trigger auf Eigenschaft geändert

Und gibt es eine Möglichkeit, ein Storyboard beim Start auszulösen, abhängig von den Werten der Klasse, für die das Datatemplate erstellt wurde?

Antwort

6

Ja, Sie können das tun.

Fügen Sie einen DataTrigger hinzu und binden Sie ihn an die entsprechende Eigenschaft. Hier ein Beispiel:

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

Sie können den Wert für Sie wollen etwas zu testen. Sie können also festlegen, dass das Storyboard beginnt, wenn sich Ihr Wert in false ändert. Sie können beliebig viele DataTriggers (oder andere Trigger) hinzufügen.

Beachten Sie, dass ich in meinem Beispiel eine Dummy-Eigenschaft und ein Storyboard referenziere.

Wenn sich die Eigenschaft ändert, wird die Bindung aktualisiert und löst den Trigger aufgrund der Datenbindung aus.

Diese Technik sollte auch beim Start funktionieren.

+0

erben, wird dies sogar funktionieren Wenn alle Werte gesetzt sind, wenn die Listbox das Objekt erhält? – Peter

+1

Ich glaube, das Storyboard würde ausgelöst werden, wenn das Objekt erfasst wird. Probieren Sie es aus und sehen Sie. –

+2

Wo in der Xaml fügen wir das hinzu? – swinefeaster

1

Ähnlich dem obigen Poster, habe ich auch einen DataTrigger verwendet und dann an eine Eigenschaft in meinem ViewModel gebunden. Die eine Sache, die ich verwirrend fand, war, wo ich den Datentrigger platzieren sollte. Ich lege es direkt in den Wurzelknoten (d. H. Fenster). Ich habe es mit Expression Blend erstellt, das sich um die Namensgebung der Tags für mich gekümmert hat.

Vergewissern Sie sich auch in Ihrem Projekt einen Verweis auf "Microsoft.Expression.Interactions"

XAML: (dies geht direkt in den Wurzelknoten)

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

Ansichtsmodell:

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)); 
     } 
    } 

Schließlich muss das Viewmodel von "INotifyPropertyChanged"

+2

Dieses Beispiel verwendet die Blend-Trigger, die sich von den integrierten WPF-Triggern unterscheiden. Aber sie sind gleich benannt. Nur verschiedene Namespaces. In gewissem Sinne könnten die Blend-Effekte als "angehängte" Trigger betrachtet werden, während die eingebauten Regeln sehr spezifische Regeln darüber enthalten, wo sie platziert werden können. –

+0

Plus eine für die Darstellung eines vollständigen Beispiels. – MickyD