none
Problema con un Converter RRS feed

  • Pregunta

  •  

    Buenas,

    he creado un converter para modificar el foreground de un textblock.

     

      public class StringToBrushConverter : IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          string text = (string)value;
          switch (text)
          {
            case "Rojo":
              return Colors.Red;
            case "Azul":
              return Colors.Blue;
            default:
              return Colors.Black;
          }
    
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          return null;
        }
    
      }
    

     


    Lo inserto en el XAML y lo asigno al textbloxck :

     

    <phone:PhoneApplicationPage.Resources>
            <local:StringToBrushConverter x:Name="StringToBrushConverter" />
    </phone:PhoneApplicationPage.Resources>
    
    <TextBlock x:Name="tbServicio" Text="{Binding Servicio}" Foreground="{Binding Servicio, Converter={StaticResource StringToBrushConverter}}" /> 
    
    


    En el momento de meter el Static Resource me da "XAML no válido" al compilar. Y no logro saber por qué es.  El textblock está agruado en un grid y también he probado a declararlo dentro de <Grid.Resources> ...</..> pero sigue igual. Logicamente la directiva "<local:StringToBrush...." es correcta. He probado un converter ya hecho de coding4fun declarandolo como recurso en PhoneApplicationPage.Resources y me ha funcionado sin darme error.

    saludos

     




    • Editado Pedro Net jueves, 27 de octubre de 2011 7:49
    jueves, 27 de octubre de 2011 7:23

Respuestas

  • Puede ser por otra cosa... ¿Has comprobado si el converter funciona? Es posible que debas devolver un Brush, actualmente estás devolviendo un Color, para ello:

    new SolidColorBrush(Colors.Red)


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Propuesto como respuesta CorsarioVasco jueves, 27 de octubre de 2011 9:25
    • Marcado como respuesta Pedro Net jueves, 27 de octubre de 2011 19:15
    jueves, 27 de octubre de 2011 9:21
  • Gracias Eugenio. Al final no ha hecho falta pasarte un ejemplo. Al pasar codigo de la page conflictiva a otro proyecto nuevo me dí cuenta que no daba error y empezé a investigar. Era muy peliagudo el error porque no te daba pista. Al final resulta ser que era porque el asembly name del proyecto tiene espacios en blanco y al compilar en diseño intenta montar el xaml de la clase converter y daba ese fallo tan feo "Invalid xaml".

     

    un abrazo ;)

    • Marcado como respuesta Pedro Net jueves, 27 de octubre de 2011 19:15
    jueves, 27 de octubre de 2011 19:15

Todas las respuestas

  • ¿Tienes el namespace "local" importado en el Root del XAML?
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    jueves, 27 de octubre de 2011 8:24
  • ¿Tienes el namespace "local" importado en el Root del XAML?
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es

    Si, cuando pongo el "clr-namespace.." en el xaml , ya me detecta el "Proyecto1".


    <phone:PhoneApplicationPage 
    
        xmlns:local="clr-namespace:Proyecto1">
    

    saludos



    • Editado Pedro Net jueves, 27 de octubre de 2011 8:45
    jueves, 27 de octubre de 2011 8:38
  • Es raro... El código no tiene errores.
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    jueves, 27 de octubre de 2011 8:57
  • Doy más info. Este textblock está dentro de un grid, que a su vez, está como "content" de un botón y todo esto es un ListBoxItem (Datatemplate).

     

            <ListBox x:Name="lbServicios" Style="{StaticResource ListBoxStyle1}" Foreground="Black" BorderBrush="#00000000" BorderThickness="0" Margin="12,270,12,0" Height="399" VerticalAlignment="Top">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Button toolkit:TiltEffect.IsTiltEnabled="True" x:Name="btLista" BorderThickness="0"  Width="462" Click="btLista_Click">
                            <Grid Height="79" Width="418">
                                <TextBlock x:Name="tbServicio" Text="{Binding Servicio}" Foreground="{Binding Servicio, Converter={StaticResource StringToBrushConverter}}" />                        
    </Grid> </Button> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

     

    El error de "Invalid XAML" me lo dá sobre la etiqueta <DataTemplate>. Lo curioso es que la etiqueta <TextBlock> con el converter lo pongo fuera del listbox y no me dá error. Lo meto dentro del DataTemplate y lo dá.

     

    saludos


    • Editado Pedro Net jueves, 27 de octubre de 2011 9:09
    jueves, 27 de octubre de 2011 9:08
  • ¿El error te lo da en compilación o en ejecución?
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    jueves, 27 de octubre de 2011 9:16
  • Al compilar. Lo raro es que sacandolo del listbox esa etiqueta no me dé error o que cambiando el recurso converter por otro tampoco me dá error...
    jueves, 27 de octubre de 2011 9:18
  • Puede ser por otra cosa... ¿Has comprobado si el converter funciona? Es posible que debas devolver un Brush, actualmente estás devolviendo un Color, para ello:

    new SolidColorBrush(Colors.Red)


    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    • Propuesto como respuesta CorsarioVasco jueves, 27 de octubre de 2011 9:25
    • Marcado como respuesta Pedro Net jueves, 27 de octubre de 2011 19:15
    jueves, 27 de octubre de 2011 9:21
  • Buenas apreciación, pero cambiandolo y re-compilando me sigue saltando.
    jueves, 27 de octubre de 2011 9:25
  • ¿Podrías mandarme el proyecto para poder mirarlo? Mi email es mail@eugenioestrada.es (si no puedes lo intentamos ver de otra forma)
    Eugenio Estrada @eugenioestrada mail@eugenioestrada.es
    jueves, 27 de octubre de 2011 9:28
  • Ahora te paso un ejemplo con esto montado.

    un abrazo y gracias.

    jueves, 27 de octubre de 2011 9:29
  • Gracias Eugenio. Al final no ha hecho falta pasarte un ejemplo. Al pasar codigo de la page conflictiva a otro proyecto nuevo me dí cuenta que no daba error y empezé a investigar. Era muy peliagudo el error porque no te daba pista. Al final resulta ser que era porque el asembly name del proyecto tiene espacios en blanco y al compilar en diseño intenta montar el xaml de la clase converter y daba ese fallo tan feo "Invalid xaml".

     

    un abrazo ;)

    • Marcado como respuesta Pedro Net jueves, 27 de octubre de 2011 19:15
    jueves, 27 de octubre de 2011 19:15