conditions - trigger with condition wpf
¿Cómo puedo tener un EventTrigger WPF en un disparador de View cuando el Viewmodel subyacente dicta que debería? (4)
Creo que tendrías que vincular a una instancia de RoutedEvent
, no a un evento de CLR.
No lo he intentado, pero algo así debería 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));
}
}
Aquí está el escenario:
Tengo el siguiente control de usuario, la idea es que su modelo de vista debería ser capaz de señalar a la vista que necesita "Activar el resplandor", reproduciendo así el Guión gráfico.
<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>
en el código detrás de UnitView, tengo:
public event EventHandler ActivateGlow;
y como es bastante normal en MVVM, tengo el siguiente DataTemplate para UnitViewModel:
<DataTemplate DataType="{x:Type vm:UnitViewModel}">
<vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>
La pregunta de Ulitmate es, ¿cómo puedo configurar algo para que el modelo de vista pueda activar el evento OnActivateGlow?
También puede poner una propiedad Boolean IsGlowing en su viewmodel y usar datatriggers en su 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>
Una forma que encontré para resolver esto es utilizar un activador de datos en una DataTemplate que contiene el control anterior ... probablemente no sea la mejor manera de hacerlo. Todavía estoy abierto a mejores ideas.
Actualización: Firoso, como se menciona en los comentarios, usted debería ser capaz (creo que es decir, no probado) de poder usar los componentes de comportamiento de mezcla para cubrir sus necesidades.
Además de descargar e instalar el SDK. Obtenga una copia de la biblioteca de ejemplos de combinación de expresiones (deberá hacer clic en Descargas en el siguiente enlace): Expression Blend samples
Esta biblioteca contiene un activador predefinido llamado ''DataEventTrigger'' que puede usar para desencadenar acciones en respuesta a un evento declarado en su viewmodel.
La mezcla SDK ya tiene (por lo que puedo decir) la otra pieza del rompecabezas, ya incluye una acción que te permite controlar los guiones gráficos. El nombre de esta acción es ''ControlStoryboardAction''.
Deberías terminar con un xaml que se ve así:
<i:Interaction.Triggers>
<samples:DataEventTrigger EventName="YourEvent">
<im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}"
ControlStoryboardOption="Play"/>
</samples:DataEventTrigger>
</i:Interaction.Triggers>
Reemplace ''YourEvent'' con el nombre del evento que ha definido en su viewmodel, y reemplace ''Storyboard1'' con el nombre de su guión gráfico. Por supuesto, los nombres deberán coincidir exactamente.
Aquí están las definiciones de espacio de nombres xaml utilizadas:
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"
Publicación original, antes de editar:
Te sugiero que estudies Comportamientos de Expression Blend: