2010-06-13 13 views
15

Bien que je sois d'accord avec le style de contrôle standard dans Silverlight, j'ai récemment commencé à utiliser des méthodes plus dynamiques de récupération des données à afficher dans les contrôles d'éléments. L'un des contrôles que je suis en train de retravailler est une collection de liens.Style conditionnel dans Silverlight?

Le problème que je rencontre est que chaque lien est coloré différemment lorsque survolée. Un rouge, un bleu, un vert, etc. Existe-t-il un moyen de styliser ces éléments sans sacrifier la dynamique d'utilisation d'un contrôle d'éléments avec un gabarit de données?

Répondre

24

Je l'ai fait en utilisant un simple convertisseur sur une propriété du modèle de vue, par exemple disons que vous aviez une propriété booléenne que vous vouliez contrôler un style que vous pourriez faire cela.

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 
} 

alors comme une ressource que vous définiriez vos deux styles ...

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

alors vous appliquer à votre objet comme celui-ci ...

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

Où est IsConfirmed une propriété booléenne sur le viewmodel, cela permettra également de garder le style en synchronisation si la propriété IsConfirmed change. Si vous voulez utiliser une condition plus compliquée qu'une booléenne, vous pouvez toujours créer un dictionnaire d'objets à Styles dans votre convertisseur, puis demander au convertisseur de faire une recherche, mais j'ai trouvé que les booléens fonctionnent généralement dans la plupart des cas.

+0

Tout à fait logique, bravo! – deanvmc