2010-08-20 12 views
18

Questo è il mio scenario.Qual è il sostituto di DataTrigger in Silverlight

Ho 2 proprietà. Tipo e stato.

Tipo è un Enum con 3 valori, ad esempio, palla, auto, freccia. State è un int che accetta 3 valori di stato ad es., -1, 0, 1. Inoltre, ho 9 immagini per ogni valore di stato.

Come, se selezioni type come ball e value come -1, voglio visualizzare una palla di colore rosso. Se seleziono il tipo come freccia e valore come 1, voglio visualizzare una freccia su. ecc.,

Sono in grado di farlo in WPF. Ho creato 3 DataTemplates con un'immagine vuota. Quindi, utilizzo DataTrigger per verificare e aggiornare la particolare immagine per lo stato selezionato.

Ma, in silverlight, come posso farlo. Lo so, devo farlo in VSM. Ma vorrei conoscere altri dettagli riguardo a questo (o) eventuali alternative disponibili.

risposta

6

Vorrei solo utilizzare un convertitore che prende il tuo oggetto con 2 proprietà e restituisce un'immagine. Codice come quello in XAML puro è doloroso e appartiene davvero a C#.

+0

Grazie mille. Finalmente, finisco con i convertitori da solo. –

17

Userei i comportamenti di GoToState con DataTriggers in Silverlight. Abbastanza semplice in Blend:

Metti tutta la tua logica per ciò che ti porta in uno stato diverso nel tuo modello di vista. Esporre lo stato come enum. Apre la scheda Stati. Crea un nuovo gruppo di stati (se non ne hai già uno). Crea i tuoi stati. Dalla scheda Risorse, selezionare Behaviors. Trascina il comportamento di GoToState dalla scheda Risorse e rilasciatelo sull'elemento visivo principale. Nel pannello Proprietà, fare clic sul pulsante "Nuovo" accanto a TriggerType e selezionare DataTrigger. Ricorda che enum sul tuo modello di vista? Impostare Trigger Binding sull'enumerazione dello stato sul modello di vista. Imposta il valore Trigger sul valore dell'enum. Imposta lo StateName nello stato di destinazione.

La combinazione ora dovrebbe generare tutto il VSM XAML. Una volta capito tutto, vedrai come in alcuni scenari non hai nemmeno bisogno dell'enum sul modello di visualizzazione: sarai in grado di escludere completamente lo stato dalla vista.

13

Per espandere il post di Mike Post, ecco XAML nel caso in cui non ci sia Blend.

È necessario aggiungere riferimenti a Microsoft.Expression.Interactions e 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" 

Poi, nel vostro controllo, allo stesso livello del VisualStateManager mettere questo:

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

Qualche possibilità di realizzare questo esempio? Ho difficoltà a trovare un bell'esempio completo in XAML online ovunque. –

5

Il post sul blog "Expression SDK in Silverlight–DataTrigger Example" copre abbastanza bene.Ecco un esempio di quello che fa:

<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 i due prefissi di namespace XML i e ia essere definiti come segue :)

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