2010-06-13 16 views
15

Mentre sto bene con lo stile di controllo standard in silverlight, recentemente ho iniziato a utilizzare metodi più dinamici per il recupero dei dati da visualizzare nei controlli degli oggetti. Uno dei controlli che sto rielaborando è una raccolta di collegamenti.Stile condizionale in Silverlight?

Il problema che sto avendo è che ogni collegamento è colorato in modo diverso quando si passa il mouse. Uno rosso, uno blu, uno verde, ecc. Esiste un modo per dare uno stile a questi elementi senza sacrificare la dinamica dell'utilizzo di un controllo di elementi con un modello di dati?

risposta

24

L'ho fatto utilizzando un semplice convertitore su una proprietà del modello di visualizzazione, ad esempio diciamo che avevi una proprietà booleana che volevi controllare uno stile che potevi fare.

public class BoolToStyleConverter : IValueConverter 
{ 
    public Style TrueStyle{ get; set; } 
    public Style FalseStyle{ get; set; } 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((bool)value) ? TrueStyle : FalseStyle; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

quindi come una risorsa definireste i vostri due stili ...

<common:BoolToStyleConverter x:Key="BoldTextConverter"> 
     <common:BoolToStyleConverter.TrueStyle> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontWeight" 
         Value="Bold"></Setter> 
      </Style> 
     </common:BoolToStyleConverter.TrueStyle> 
     <common:BoolToStyleConverter.FalseStyle> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontWeight" 
         Value="Normal"></Setter> 
      </Style> 
     </common:BoolToStyleConverter.FalseStyle> 
    </common:BoolToStyleConverter> 

allora si dovrebbe applicare al vostro oggetto come questo ...

<TextBlock Text="{Binding Description}" 
      Margin="20,4,4,4" 
      Style="{Binding IsConfirmed, Converter={StaticResource BoldTextConverter}}"></TextBlock> 

Dove IsConfirmed è una proprietà booleana sul viewmodel, questo manterrà anche lo stile sincronizzato se la proprietà IsConfirmed cambia.

Se si desidera utilizzare una condizione più complessa di un booleano, è sempre possibile creare un dizionario di oggetti in Stili nel convertitore e quindi fare in modo che il convertitore esegua una ricerca, ma ho riscontrato che in genere i booleani funzionano nella maggior parte dei casi.

+0

Ha perfettamente senso, evviva! – deanvmc