WinRT: Establecer un estilo Condicional (2) #Metro #Win8 - El blog de Javier Torrecilla

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!

Published 26/4/2012 10:17 por Javier Torrecilla
Archivado en: ,,,,,
Comparte este post:
http://geeks.ms/blogs/jtorrecilla/archive/2012/04/26/winrt-establecer-un-estilo-condicional-2-metro-win8.aspx

Comentarios

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

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

Thursday, April 26, 2012 8:55 PM por Josué Yeray Julián Ferreiro

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

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!

Friday, April 27, 2012 7:55 AM por Javier Torrecilla

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

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:

<converters:BooleanStyleConverter

 x:Name="GenderConverter"

 StyleIfTrue="{StaticResource StyleA}"

 StyleIfFalse="{StaticResource StyleB}"/>

Wednesday, May 02, 2012 4:07 PM por Pablo Núñez