Pergunta

Eu tenho um DataTemplate que é para uma classe que implementa INotifyPropertyChanged. Existe alguma maneira de provocar um storyboard quando uma propriedade mudanças e um storyboard diferente em diferentes valores (seu um bool neste caso)?

E há alguma maneira de provocar um storyboard na inicialização dependendo valores na classe que o datatemplate é feita para?

Foi útil?

Solução

Sim, você pode fazer isso.

Adicionar um DataTrigger e se ligam à respectiva propriedade. Aqui está um exemplo:

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

Você pode definir o valor de teste para a qualquer coisa que você quiser. Assim, você poderá definir o storyboard para começar quando seu valor muda para falso. Você pode adicionar tantos DataTriggers (ou outros gatilhos), como você deseja.

Observe que no meu exemplo I referência a uma propriedade manequim e storyboard.

Quando as alterações de propriedade, a ligação será atualizado e irá disparar o gatilho por causa da ligação de dados.

Esta técnica também deve trabalhar na inicialização.

Outras dicas

Assim como o cartaz acima, eu também usou um DataTrigger e depois ligou-o a uma propriedade em meu ViewModel. A única coisa que eu achei confundindo foi onde colocar o gatilho de dados. Eu colocá-lo directamente no nó raiz (isto é janela). Eu criei-lo usando Expression Blend, que cuidou dos detalhes tag de nomenclatura para mim.

Certifique-se também incluir em seu projeto uma referência a "Microsoft.Expression.Interactions"

XAML: (este vai diretamente no nó de raiz)

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

Finalmente, o ViewModel deve herdar "INotifyPropertyChanged"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top