2010-06-13 11 views
15

Aunque estoy de acuerdo con el estilo de control estándar en Silverlight, recientemente comencé a usar métodos más dinámicos de búsqueda de datos para mostrar en los controles de elementos. Uno de los controles que estoy reelaborando es una colección de enlaces.estilo condicional en Silverlight?

El problema que estoy teniendo es que cada enlace tiene un color diferente cuando pasa el mouse. Uno rojo, uno azul, uno verde, etc. ¿Hay alguna manera de diseñar estos elementos sin sacrificar la dinámica de usar un control de elementos con una plantilla de datos?

Respuesta

24

Lo he hecho usando un convertidor simple en una propiedad del modelo de vista, por ejemplo, digamos que tiene una propiedad booleana que desea controlar un estilo que podría hacer esto.

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 
} 

continuación, como un recurso que definiría sus dos estilos ...

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

allí tendría que aplicarlo a su objeto como éste ...

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

Dónde está IsConfirmed una propiedad booleana en el modelo de vista, esto también mantendrá el estilo sincronizado si la propiedad IsConfirmed cambia.

Si desea utilizar una condición más complicada que un booleano, siempre puede crear un Diccionario de objetos para Estilos en su convertidor y luego hacer que el convertidor realice una búsqueda, pero he encontrado que normalmente los booleanos funcionan en la mayoría de los casos.

+0

¡Tiene perfecto sentido, salud! – deanvmc