Como eu posso ter um WPF EventTrigger em um gatilho ponto de vista quando os ditames viewmodel subjacentes que deveria?
-
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?
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:
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.