Pergunta

Esta é uma situação que surge muitas vezes:

No Vista, você tem um controle vinculado a uma propriedade ViewModel (apoiado por uma INotifyPropertyChanged). Por exemplo:

<TextBlock Text="{Binding Path=Subtotal}"/>

Quando as alterações de propriedade, você precisa chamar a atenção do usuário para o fato com alguma animação criativo. Como posso utilizar o fato de que a visão já está preparado para a notificação e evitar a criação de grande parte do código extra (ou pelo menos criar uma vez e re-uso). gatilhos de dados são provavelmente a melhor escolha, mas eu não sei como fazê-los fogo sobre qualquer alteração de valor em relação a algum valor específico.

As seguintes opções vêm à mente:

  • levantar um evento adicional no ViewModel, inscrever na Vista de código.
  • criar um DataTrigger vinculado à propriedade mencionou usando um conversor que iria retornar true se o valor está mudando.
  • criar um DataTrigger vinculado a uma nova propriedade booleana no ViewModel que é usado para "sinal" a mudança.
  • criar um comportamento anexado ao controle que subscrever a alteração propriedade de dependência do controle e iniciar a animação.

Qual deles você gosta use /? Eu perdi todas as opções?

P.S. Seria bom (mas não crítica) se a solução proporcionaria uma possibilidade para iniciar a animação primeiro e refletir a alteração do valor quando é terminado.

Foi útil?

Solução

Ok, é isso que eu vim para depois de algumas experiências.

Eu criei um Expression Blend 3 gatilho com uma propriedade de dependência (I nomeou-o de subscrição). I ligam a assinatura para o mesmo valor que o meu TextBlock é obrigado a e este gatilho é anexado a um ControlStoryboardAction de Expression Blend 3.

Aqui está o gatilho:

public class DataTriggerPlus : TriggerBase<DependencyObject>
{
    public static readonly DependencyProperty SubscriptionProperty =
        DependencyProperty.Register("Subscription", 
            typeof(string),
            typeof(DataTriggerPlus),
            new FrameworkPropertyMetadata("",
              new PropertyChangedCallback(OnSubscriptionChanged)));

    public string Subscription
    {
        get { return (string)GetValue(SubscriptionProperty); }
        set { SetValue(SubscriptionProperty, value); }
    }

    private static void OnSubscriptionChanged(DependencyObject d,
      DependencyPropertyChangedEventArgs e)
    {
        ((DataTriggerPlus)d).InvokeActions(null);
    }
}

Aqui está como ele é ligado ao storyboard:

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
    <i:Interaction.Triggers>
        <local:DataTriggerPlus Subscription="{Binding TestProp}">
            <im:ControlStoryboardAction 
                Storyboard="{StaticResource Storyboard1}"/>
        </local:DataTriggerPlus>
    </i:Interaction.Triggers>
</TextBlock>

Eu gosto desta abordagem muito, grande mistura de trabalho 3 designers!

Edit: respondendo de Drew comentário ...

Sim, ele vem com Blend. Você pode incluir apenas Microsoft.Expression.Interactions.dll e System.Windows.Interactivity em seu projeto.

E sim, é detalhada (eu perguntei se alguém descobriu uma boa maneira de aplicar comportamentos via Styles nesta questão ) - mas há também um benefício de flexibilidade. Por exemplo, você pode não só iniciar um storyboard, mas também mudar um estado ou fazer alguma outra ação do mesmo gatilho.

Outras dicas

Você pode criar um gatilho que irá iniciar a animação.

Algo parecido com isto:

<Style>
    <Style.Triggers>
       <Trigger 
            Property="ViewModelProperty"
            Value="True">
            <Trigger.EnterActions>
                 <BeginStoryboard Storyboard="YourStoryBoard" />
            </Trigger.EnterActions>
       </Trigger>
    </Style.Triggers>
</Style>

Quanto à questão para a questão da definição do valor uma vez que a animação foi concluída, este é um pouco de dor. Tanto quanto eu estou ciente que você precisa para usar o evento concluído no storyboard, isso requer trás código, que é algo que você quer evitar com MVVM.

Eu tentei usar eventtriggers para ligar para os eventos concluídos, mas que também introduz algumas complicações. Consulte aqui para mais detalhes.

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