2011-02-22 16 views
13

Tengo un requisito para cambiar el estilo de un botón en función de un valor en los datos. Parece que un StyleSelector funcionaría perfectamente, pero no parece haber una manera de configurar uno para un botón.Use un selector de estilo para un botón

¿Hay alguna manera de configurar dinámicamente un estilo de botón a partir de los datos? Tal vez incluso un enfoque XAML puro?

+0

echa un vistazo a [esta publicación] (http://stackoverflow.com/questions/3863799/how-to-change-button-template-dynamically-wpf). –

Respuesta

21

podría colocar su Button Estilos en un diccionario de recursos y se unen el estilo para el Button y utilizar un convertidor

ButtonStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="ButtonStyle1" TargetType="Button"> 
     <Setter Property="Background" Value="Green"/> 
     <Setter Property="FontSize" Value="12"/> 
    </Style> 
    <Style x:Key="ButtonStyle2" TargetType="Button"> 
     <Setter Property="Background" Value="Red"/> 
     <Setter Property="FontSize" Value="14"/> 
    </Style> 
</ResourceDictionary> 

Entonces, por Button que tiene este requisito vincular Style a la propiedad de interés

<Button ... 
     Style="{Binding Path=MyDataProperty, 
         Converter={StaticResource ButtonStyleConverter}}"/> 

Y en el convertidor se carga el diccionario de recursos ButtonStyles y devuelva el estilo deseado en función del valor

public class ButtonStyleConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Uri resourceLocater = new Uri("/YourNameSpace;component/ButtonStyles.xaml", System.UriKind.Relative); 
     ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater); 
     if (value.ToString() == "Some Value") 
     { 
      return resourceDictionary["ButtonStyle1"] as Style; 
     } 
     return resourceDictionary["ButtonStyle2"] as Style; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Sé que esta pregunta fue hecha hace mucho tiempo. Pero estoy intentando lograr algo similar y me encontré con un problema. ¿Cómo hago esto para trabajar con una plantilla de Artículo? Así Datatemplate con un cuadro de texto con un estilo encuadernado – Daanvl

18

Una forma más general de lograr lo mismo:

SomeView.xaml

<UserControl> 
    <UserControl.Resources> 
    <converters:BooleanToStyleConverter x:Key="MyButtonStyleConverter" 
     TrueStyle="{StaticResource AmazingButtonStyle}" 
     FalseStyle="{StaticResource BoringButtonStyle}"/> 
    </UserControl.Resources> 
    <Grid> 
    <Button Style={Binding IsAmazingButton, Converter={StaticResource MyButtonStyleConverter}}/> 
    </Grid> 
</UserControl> 

BooleanToStyleConverter.cs

public class BooleanToStyleConverter : IValueConverter 
{ 
    public Style TrueStyle { get; set; } 
    public Style FalseStyle { get; set; } 

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

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

Este convertidor funciona en cualquier vista con cualquier tipo de control con el estilo que elija, siempre y cuando se enlace a una propiedad booleana en su ViewModel para controlar el cambio de estilo. Sin embargo, es fácil de adaptar a otros requisitos vinculantes. Esto también funciona en una plantilla de datos.

+1

¡Gracias, buena persona! – Artiom

+1

Finalmente, una manera agradable, simple y elegante de establecer un estilo condicionalmente basado en datos encuadernados. No puedo creer que haya tardado tanto en encontrarlo. Gracias. –

Cuestiones relacionadas