Question

J'ai un DataTemplate destiné à une classe qui implémente INotifyPropertyChanged. Existe-t-il un moyen de déclencher un storyboard quand une propriété change et un autre storyboard sur différentes valeurs (c'est un bool dans ce cas)?

Et existe-t-il un moyen 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éé?

Était-ce utile?

La solution

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 comme bon vous semble. 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 fais référence à une propriété factice et à un storyboard.

Lorsque la propriété sera modifiée, la liaison sera mise à jour et déclenchera le déclencheur en raison de la liaison de données.

Cette technique devrait également fonctionner au démarrage.

Autres conseils

Semblable à l’affiche ci-dessus, j’ai également utilisé un DataTrigger, puis l’a lié à une propriété de mon ViewModel. La seule chose que j'ai trouvée déroutante était de savoir où placer le déclencheur de données. Je le mets directement dans le nœud racine (c'est-à-dire Window). Je l'ai créé en utilisant Expression Blend, qui s'est occupé des détails de nommage des balises pour moi.

Veillez également à inclure dans votre projet une référence à "Microsoft.Expression.Interactions"

.

XAML: (cela va directement dans le noeud 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>

Modèle de vue:

 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 modèle de vue doit hériter de "INotifyPropertyChanged"

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top