WinRT: Establecer un estilo Condicional (2) #Metro #Win8

Introducción

Ayer publique una entrada en la que hablaba de aplicar un estilo condicional a un control en xaml.

Después de  revisar si se puede utilizar StyleSelector o DataTemplateSelector, ambos son válidos a aplicar para un control como el ListBox, pero no por ejemplo para un TextBox o un TextBlock.

Código V2:

Dandole una pequeña vuelta de tuerca, y a pesar que me sigue pareciendo un “Bad Code Smell”, me he creado un nuevo converter:

   1: public class BooleanStyleConverter : IValueConverter

   2: {

   3:  

   4:     public object Convert(object value, Type targetType, object parameter, string language)

   5:     {

   6:         var page = new MyXamlPage();

   7:  

   8:         return ((bool)value ? page.Resources["StyleA"] as Style : page.Resources["StyleB"] as Style);

   9:     }

  10:  

  11:     public object ConvertBack(object value, Type targetType, object parameter, string language)

  12:     {

  13:         throw new NotImplementedException();

  14:     }

  15: }

En el converter se define la pagina donde se encuentran los estilos, y nuestro control, y a través del diccionario de recursos devolvemos un estilo según nuestro condicionante.

Su aplicación en  código:

1) Definir el converter en los recursos:

   1: <converters:BooleanStyleConverter x:Name="GenderConverter"/>

2) Definir nuestro control con su Binding y Converter:

   1: <TextBlock Text="{Binding Child.Name}" Style="{Binding Child.Gender,Converter={StaticResource GenderConverter}}" />

Espero que os sea de utilidad, o si veis alguna opción mejor, lo comenteis Open-mouthed smile

 

Saludos!

3 comentarios en “WinRT: Establecer un estilo Condicional (2) #Metro #Win8”

  1. Buenas tío!

    Yo no creo que huela mal esto, es mas, me parece muy correcto. Este es un claro ejemplo del poder de los converters. Otra solución pasaría por usar propiedades de una viewmodel pero eso si seria una guarrada. Gran artículo 😀

  2. Gracias por contestar =D

    Respecto a que me parece un poco Bad Smell, es porque sería más sencillo con un StyleSelector, pero habría que implementarlo a través de un custom control….

    Gracias de nuevo!

  3. A mí tampoco me parece mal hacerlo con converters, pero le haría una mejora: en lugar de poner a pelo (hardcoded) los estilos en el Converter (y usar un new MyXamlPage sí huele mal ;), me parece más limpio si añades 2 propiedades públicas al Converter y las asignas al instanciarlo en XAML usando StaticResource. Así además el mismo converter te sirve para muchos otros casos. Quedaría como:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *