Como eu posso ter um WPF EventTrigger em um gatilho ponto de vista quando os ditames viewmodel subjacentes que deveria?

StackOverflow https://stackoverflow.com/questions/1424202

  •  07-07-2019
  •  | 
  •  

Pergunta

Aqui está o cenário:

Eu tenho o seguinte controle de usuário, a idéia é que é modelo de visão deve ser capaz de sinalizar para a visão de que ele precisa "Ativar o Glow", desempenhando assim o Storyboard.

<UserControl x:Class="View.UnitView"  ... >
   ...
    <Storyboard x:Key="ActivateGlow">
       ...
    </Storyboard>
    ...
    <!-- INVALID BINDING! Not Dependancy Object-->
    <EventTrigger RoutedEvent="{Binding OnActivateGlow}"> 
       <BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
    </EventTrigger>
</UserControl>

no codebehind para UnitView, eu tenho:

public event EventHandler ActivateGlow;

e como é bastante normal em MVVM, eu tenho o seguinte DataTemplate para UnitViewModel:

<DataTemplate DataType="{x:Type vm:UnitViewModel}">
    <vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>

A questão ulitmate é, como posso criar algo para que o viewmodel pode disparar o evento OnActivateGlow?

Foi útil?

Solução

Update:. Firoso, como mencionado nos comentários que você deve ser capaz de (eu acho - ou seja, não testado) ser capaz de usar os componentes de comportamento mistura para cobrir sua exigência

Além de baixar e instalar o SDK. Obter uma cópia da biblioteca amostras Expression Blend (você precisa clicar em Download a partir do link a seguir): amostras Expression Blend

Esta biblioteca contém um gatilho pré-construída chamado 'DataEventTrigger', que você pode usar para ações de disparo em resposta a um evento declarou em seu viewmodel.

O SDK mistura já tem (pelo que eu posso dizer) a outra peça do quebra-cabeça - ele já inclui uma ação que lhe permite controlar storyboards. O nome desta acção é 'ControlStoryboardAction'.

Você deve acabar com alguns XAML que tem esta aparência:

    <i:Interaction.Triggers>
        <samples:DataEventTrigger EventName="YourEvent">
            <im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}" 
                   ControlStoryboardOption="Play"/>
        </samples:DataEventTrigger>
    </i:Interaction.Triggers>

Substituir 'YourEvent' com o nome do evento que você definiu no seu viewmodel, e substituir 'Storyboard1' com o nome de seu storyboard. É claro que os nomes terão que corresponder exatamente.

Aqui estão as definições de namespace XAML usado:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"

Original post, antes de editar:

Sugerir você olhar para Comportamentos do Expression Blend:

informações

Misture SDK

vídeo sobre comportamentos

Outras dicas

Você também pode colocar uma propriedade IsGlowing boolean em seus ViewModel e uso DataTriggers no seu estilo

<Rectangle.Style>  
    <Style TargetType="{x:Type Rectangle}">  
        <Style.Triggers>  
            <DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">  
                <DataTrigger.EnterActions>  
                    <BeginStoryboard>  
                        <Storyboard>  
                            ...  
                        </Storyboard>  
                    </BeginStoryboard>  
                </DataTrigger.EnterActions>  
            </DataTrigger>  
        </Style.Triggers>  
    </Style>  
</Rectangle.Style>  

Eu acredito que você teria que se ligam a um RoutedEvent exemplo, não um evento CLR.

Eu não tentei, mas algo como isso deve funcionar:

public class UnitView
{
    public static readonly RoutedEvent ActivateGlowEvent
        = EventManager.RegisterRoutedEvent(
              "ActivateGlow", RoutingStrategy.Bubble,
              typeof(RoutedEventHandler), typeof(UnitView)
          );

    public void RaiseActivateGlowEvent()
    {
        RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
    }
}

Uma maneira que eu encontrei para resolver isso é usar um gatilho de dados em um DataTemplate que contém o controle acima ... provavelmente não a melhor maneira de fazer isso no entanto. Eu ainda estou aberto a idéias melhores.

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