2010-08-20 12 views
18

Esta es mi situación.¿Cuál es el reemplazo de DataTrigger en Silverlight?

Tengo 2 propiedades. Tipo y estado.

Tipo es un Enum con 3 valores, por ejemplo, bola, coche, flecha. State es un int que aceptará 3 valores de estado, p. Ej., -1, 0, 1. Además, tengo 9 imágenes para cada valor de estado.

Me gusta, si selecciono tipo como bola y valor como -1, quiero mostrar una bola de color rojo. Si selecciono el tipo como flecha y el valor como 1, quiero mostrar una flecha hacia arriba. etc.,

Puedo hacer esto en WPF. Creé 3 plantillas de datos con una imagen vacía. Luego, utilizo DataTrigger para verificar y actualizar la imagen particular del StateValue seleccionado.

Pero, en Silverlight, ¿cómo puedo hacer esto. Lo sé, tengo que hacerlo en VSM. Pero me gustaría saber más detalles sobre esta (o) cualquier alternativa disponible.

Respuesta

6

Solo usaría un convertidor que toma su objeto con 2 propiedades y devuelve una imagen. Código como ese en XAML puro es doloroso y realmente pertenece a C#.

+0

muchas gracias. Finalmente, termino con convertidores solo. –

17

Usaría comportamientos de GoToState con DataTriggers en Silverlight. Bastante simple en Blend:

Pon toda tu lógica para lo que te lleva a un estado diferente en tu modelo de vista. Exponer el estado como una enumeración. Abra la pestaña Estados. Crea un nuevo grupo de estado (si aún no tienes uno). Crea tus estados. En la pestaña Activos, seleccione Comportamientos. Arrastre el comportamiento de GoToState desde la pestaña Activos y suéltelo en su elemento visual raíz. En el panel Propiedades, haga clic en el botón "Nuevo" junto a TriggerType y seleccione DataTrigger. ¿Recuerdas esa enumeración en tu modelo de vista? Establezca la vinculación del activador en la enumeración de estado en el modelo de visualización. Establezca el Valor de activación en el valor de la enumeración. Establezca StateName en el estado de destino.

Blend ahora debe haber generado todo el VSM XAML para usted. Una vez que se familiarice con las cosas, verá cómo, en algunos escenarios, ni siquiera necesita la enumeración en el modelo de vista: podrá expulsar completamente el estado de la vista.

13

Para ampliar la publicación de Mike Post aquí está el XAML en caso de que no tenga Blend.

Debe agregar referencias a Microsoft.Expression.Interactions y System.Windows.Interactivity.

xmlns:ia="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
xmlns:iv="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

Luego, en su control, al mismo nivel que el VisualStateManager poner esto:

<iv:Interaction.Triggers> 
    <ia:DataTrigger Binding="{Binding PropertyName}" Value="PropertyValue" > 
     <ia:GoToStateAction StateName="StateName" /> 
    </ia:DataTrigger> 
</iv:Interaction.Triggers> 
+1

¿Alguna posibilidad de que pueda construir este ejemplo? Tengo problemas para encontrar un buen ejemplo completo en XAML en línea en cualquier lugar. –

5

La entrada de blog "Expression SDK in Silverlight–DataTrigger Example" cubre bastante bien.Este es un ejemplo de lo que hace:

<i:Interaction.Triggers> 
    <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="false"> 
     <ia:ControlStoryboardAction Storyboard="{StaticResource DisableStoryboard}"></ia:ControlStoryboardAction> 
    </ia:DataTrigger> 

    <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="true"> 
     <ia:ControlStoryboardAction Storyboard="{StaticResource EnableStoryboard}"></ia:ControlStoryboardAction> 
    </ia:DataTrigger> 
</i:Interaction.Triggers> 

(Con los dos prefijos de espacio de nombres XML i y ia se definen como sigue :)

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions" 
Cuestiones relacionadas