Use un StyleSelector para un botón

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.

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

Puede colocar sus Estilos de Button en un Diccionario de Recursos y enlazar el Estilo para el Button y usar un Convertidor

ButtonStyles.xaml

     

Luego, para el Button que tiene este requisito, vincula el Style a la propiedad de interés

  

Y en el convertidor, carga el diccionario de recursos ButtonStyles y devuelve 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(); } } 

Una forma más general de lograr lo mismo:

SomeView.xaml

         

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, utilizando el estilo que elija, siempre y cuando se vincule 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.