2009-08-25 9 views
12

Tengo un convertidor de valor que formatea los números (aún no puedo usar SP1). Funciona bien hasta que obtiene un porcentaje.¿Cómo puedo escapar de una comilla simple en un literal de propiedad de extensión de marcado XAML?

He aquí un ejemplo:

<TextBlock Text="{Binding Path=PercentageComplete, 
          Converter={StaticResource NumberFormatter}, 
          ConverterParameter='0.00 %'}" /> 

Por desgracia para mí cuando Double.ToString ve un personaje porcentaje, se multiplica por el número 100. En mi caso, el número ya es un porcentaje y se necesita ninguna conversión.

En C#, esto se lograría por evadir el carácter % con una comilla simple:

(99.99).ToString("0.00 %") // gives -> "9999 %" 
(99.99).ToString("0.00 '%") // gives -> "99.99 %" 

Por desgracia, no puedo utilizar una comilla simple en el ConverterParameter en la extensión de marcado XAML anterior. ¿Hay alguna forma de escapar? Intenté duplicar las comillas simples y usar una barra diagonal inversa, pero ambas no pudieron compilarse.

Respuesta

11

no probado, pero ¿ha intentado:

<TextBlock Text="{Binding Path=PercentageComplete, 
         Converter={StaticResource NumberFormatter}, 
         ConverterParameter=&quot;0.00 '%&quot;}" /> 
+1

Fantástico. Funciona como un amuleto, aunque prefiero esta variante que también funciona (y solo lo intenté después de su sugerencia): 'ConverterParameter = '0.00 "%''. Muchas gracias. –

+0

También vale la pena señalar que la variante que menciono no hace que VS marque el código subsiguiente en rojo, aunque se compila muy bien. –

+0

Irónicamente, tenía algo similar, pero pensé que funcionaría mejor al revés, así que lo cambié :) –

2

Aquí es una solución que evita la extensión de marcado, aunque no es una respuesta directa a la pregunta.

<TextBlock> 
    <TextBlock.Text> 
    <Binding Path="PercentageComplete" 
      Converter="{StaticResource NumberFormatter}" 
      ConverterParameter="0.00 '%" /> 
    </TextBlock.Text> 
</TextBlock> 
3

Se puede utilizar en lugar de String.Format Double.ToString

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    string format = (string) parameter; 

    return String.Format(format, value); 
} 

Y en su expresión de enlace, utilice la secuencia especial de escape {}:

<TextBlock Text="{Binding PercentageComplete, Converter={StaticResource NumberFormatter}, ConverterParameter='{}{0:0.00} %'}"></TextBlock> 
9

La continuación es tomada desde http://msdn.microsoft.com/en-us/library/ee200269.aspx.

Puede escapar de cualquier carácter con una barra invertida. No analiza las barras diagonales inversas, sino que las omite. Por lo tanto:

  • 'foo\'bar' se convierte en foo'bar;
  • "foo\"bar" se convierte en foo"bar;
  • 'foo\\bar' se convierte en foo\bar;
  • 'foo\nbar' se convierte en foonbar y no es un carácter de nueva línea.

Sin embargo, el análisis de la extensión de marcado es bastante extraño. Aunque el resaltado de sintaxis de Visual Studio no lo admite, cualquier carácter que no sea \{},= es un carácter de valor válido.Esto significa que las siguientes construcciones son legales:

  • {MyExtension Name=foo'bar} (cotizaciones debe ser el primer carácter para ser considerado citando a una cadena; en otro sitio es sólo una copia literal);
  • {MyExtension Name=f oo} (los espacios son legales también; esto se convierte en f oo);
  • {MyExtension Name= foo } (los espacios alrededor del valor se recortan; esto se convierte en foo);
  • {MyExtension Name=foo\\bar} (los caracteres después de \ se copian textualmente, por lo que se convierte en foo\bar);
  • {MyExtension Name=foo \\ bar} (esto se convierte en foo \ bar);
  • {MyExtension Name=foo \} bar} (y esto se convierte en foo } bar).

Tenga en cuenta que las reglas se aplican aquí también \: cualquier carácter después de un \ se copia palabra por palabra.

+2

¿Has probado esto? Tengo un ejemplo aquí donde quiero insertar '\ t' como ConvertidorParameter. '\ t' me da 't' y '\\ t' me da '\\ t'. – Mixxiphoid

+0

De hecho, no puedo duplicar los resultados como se prescribe arriba. '' <- tanto el constructor como los valores de propiedad regresan exactamente como se describe, como 'foo \\ bar'. –

Cuestiones relacionadas