2010-06-13 10 views
15

Während mir das Standardsteuerungsstyling in Silverlight gut geht, habe ich vor kurzem begonnen, dynamischere Methoden zum Abrufen von Daten zu verwenden, die in Elementsteuerelementen angezeigt werden. Eine der Steuerelemente, die ich gerade bearbeite, ist eine Sammlung von Links.Bedingtes Styling in Silverlight?

Das Problem, das ich habe, ist, dass jeder Link beim Mouseover anders gefärbt wird. Ein Rot, ein Blau, ein Grün usw. Gibt es eine Möglichkeit, diese Elemente zu stylen, ohne die Dynamik der Verwendung eines Elementsteuerelements mit einer Datenvorlage zu beeinträchtigen?

Antwort

24

Ich habe dies mit einem einfachen Konverter auf eine Eigenschaft des Ansichtsmodells getan, zum Beispiel haben Sie eine boolesche Eigenschaft, die Sie einen Stil steuern wollten, könnten Sie dies tun.

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 
} 

dann als Ressource Sie zwei Arten definieren würde ...

<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> 

dann würden Sie es wie folgt auf Ihr Objekt anwenden ...

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

Wo IsConfirmed ist eine boolesche Eigenschaft auf dem Viewmodel. Dadurch wird der Style auch synchronisiert, wenn sich die IsConfirmed-Eigenschaft ändert.

Wenn Sie eine kompliziertere Bedingung als einen booleschen verwenden möchten, könnten Sie immer ein Dictionary von Objekten zu Styles in Ihrem Konverter erstellen und dann den Konverter nachschlagen lassen, aber ich habe herausgefunden, dass in den meisten Fällen boolesche Operationen funktionieren.

+0

Macht perfekten Sinn, Prost! – deanvmc