Domanda

Ho un DataTemplate che è per una classe che implementa INotifyPropertyChanged. Esiste un modo per attivare uno storyboard quando una proprietà cambia e uno storyboard diverso su valori diversi (è un bool in questo caso)?

E c'è un modo per innescare uno storyboard all'avvio a seconda dei valori sulla classe per cui è realizzata la piastra dati?

È stato utile?

Soluzione

Sì, puoi farlo.

Aggiungi un DataTrigger e associa alla rispettiva proprietà. Ecco un esempio:

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

Puoi impostare il valore da testare su tutto ciò che desideri. Quindi puoi impostare lo storyboard per iniziare quando il tuo valore diventa falso. Puoi aggiungere tutti i DataTrigger (o altri trigger) che desideri.

Nota che nel mio esempio faccio riferimento a una proprietà fittizia e allo storyboard.

Quando la proprietà cambia, l'associazione verrà aggiornata e farà scattare il trigger a causa del databinding.

Questa tecnica dovrebbe funzionare anche all'avvio.

Altri suggerimenti

Simile al poster sopra, ho anche usato un DataTrigger e poi lo ho associato a una proprietà nel mio ViewModel. L'unica cosa che ho trovato confuso era dove mettere il trigger di dati. L'ho messo direttamente nel nodo radice (cioè Window). L'ho creato usando Expression Blend che si è occupato dei dettagli di denominazione dei tag per me.

Assicurati inoltre di includere nel tuo progetto un riferimento a " Microsoft.Expression.Interactions "

XAML: (questo va direttamente nel nodo radice)

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

Infine, Viewmodel deve ereditare da " INotifyPropertyChanged "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top