2010-11-17 14 views
48

Quiero formatear mi enlace de cadena como Amount is X donde X es una propiedad vinculada a una etiqueta.WPF StringFormat en contenido de etiqueta

he visto muchos ejemplos, pero el siguiente no funciona:

<Label Content="{Binding Path=MaxLevelofInvestment, 
    StringFormat='Amount is {0}'}" /> 

También he probado estas combinaciones:

StringFormat=Amount is {0} 
StringFormat='Amount is {}{0}' 
StringFormat='Amount is \{0\}' 

Incluso he intentado cambiar el tipo de datos de la propiedad de unión con int , string y double. Nada parece funcionar. Este es un caso de uso muy común, pero no parece ser compatible.

Respuesta

138

La razón esto no funciona es que la propiedad es de tipo Label.ContentObject y Binding.StringFormat solo se usa cuando se vincula a una propiedad del tipo String.

Lo que ocurre es:

  1. El Binding es el boxeo su valor MaxLevelOfInvestment y almacenarlo la propiedad Label.Content como un valor decimal en caja.
  2. El control Label tiene una plantilla que incluye un ContentPresenter.
  3. Dado que ContentTemplate no está configurado, ContentPresenter busca DataTemplate definido para el tipo Decimal. Cuando no encuentra ninguno, usa una plantilla predeterminada.
  4. La plantilla predeterminada utilizada por ContentPresenter presenta cadenas utilizando la propiedad ContentStringFormat de la etiqueta.

dos soluciones son posibles:

  • Uso Label.ContentStringFormat en lugar de Binding.StringFormat o
  • utilizar una propiedad de cadena como TextBlock.Text en lugar de Label.Content

Aquí se explica cómo usar Label.ContentStringFormat:

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" /> 

Aquí es cómo utilizar un TextBlock:

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" /> 

Nota: Para simplificar he omitido un detalle de la explicación anterior: El ContentPresenter realmente utiliza su propio Template y StringFormat propiedades, pero durante al cargar estos se enlazan automáticamente a la plantilla con las propiedades ContentTemplate y ContentStringFormat del Label, por lo que parece que el ContentPresenter está realmente usando las propiedades de Label.

+0

gracias por la explicación detallada, ahora tiene sentido. hasta el equipo de WPF para hacer esto ordenado para el futuro. –

+0

Me gusta su respuesta, ¿sabría cómo usar 2 params en lugar de solo 1? Realmente estoy luchando aquí (como TextBlock stringFormat puede manejar múltiples al usar desencadenadores, etc.). – EricG

1

Trate de usar un convertidor ....

<myconverters:MyConverter x:Key="MyConverter"/> 


<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} /> 


public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return String.Format("Amount is {0}", value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
} 
+2

Esto no es necesario y oculta el formato en código subyacente. – SLaks

+0

Tal vez sea así, pero esto resolverá el problema. – Gabe

+3

Es excesivo. Explico la causa del problema y presento dos soluciones simples en mi respuesta. –

3

acabo de comprobar y por alguna razón no funciona con la etiqueta, probablemente debido a que utiliza una ContentPresenter para la propiedad contenido internamente. Puedes usar un TextBlock y eso funcionará. También puede poner el extracto TextBlock continuación en el contenido de una etiqueta si necesita heredar el estilo, comportamiento, etc.

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} /> 
2

Hacer un StringFormatConverter : IValueConverter universales. Pase su cadena de formato como ConverterParameter.

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'" 

Además, asegúrese de StringFormatMultiConverter : IMultiValueConverter cuando se necesita más de un objeto en la cadena de formato, por ejemplo, Completed {0} tasks out of {1}.

+0

Me gusta esto. Puedo ver el valor de usar tanto el enfoque puro 'XAML' como el convertidor de valor. – IAbstract

Cuestiones relacionadas