WPF StringFormat en el contenido de la etiqueta

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

He visto muchos ejemplos, pero el siguiente no funciona:

  

También probé estas combinaciones:

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

Incluso traté de cambiar el tipo de datos de la propiedad de enlace a int , string y double . Nada parece funcionar. Este es un caso de uso muy común, pero no parece ser compatible.

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

Lo que está sucediendo es:

  1. La Binding encajona su valor de MaxLevelOfInvestment y lo almacena la propiedad Label.Content como un valor decimal Label.Content .
  2. El control Label tiene una plantilla que incluye un ContentPresenter .
  3. Dado que ContentTemplate no está configurado, ContentPresenter busca un 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 la etiqueta.

Dos soluciones son posibles:

  • Use Label.ContentStringFormat en lugar de Binding.StringFormat, o
  • Utilice una propiedad String como TextBlock.Text en lugar de Label.Content

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

  

Aquí está cómo usar un TextBlock:

  

Nota: Para simplificar, omití un detalle en la explicación anterior: ContentPresenter realmente usa sus propias propiedades Template y StringFormat , pero durante la carga, estas se vinculan automáticamente a las propiedades ContentTemplate y ContentStringFormat de la Label , por lo que parece que el ContentPresenter está realmente usando las propiedades de la Label .

Acabo de verificar y, por algún motivo, no funciona con la etiqueta, probablemente porque utiliza un ContentPresenter para la propiedad de contenido internamente. Puedes usar un TextBlock y eso funcionará. También puede poner el extracto de TextBlock a continuación en el contenido de una etiqueta si necesita heredar el estilo, el comportamiento, etc.

 
		      	

Haga un StringFormatConverter : IValueConverter universal StringFormatConverter : IValueConverter . Pase su cadena de formato como ConverterParameter .

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

Además, StringFormatMultiConverter : IMultiValueConverter cuando necesite más de un objeto en cadena de formato, por ejemplo, Completed {0} tasks out of {1} .

Intenta usar un convertidor …

   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; } } 

Tal vez esto ayude…

Insertar código en XAML

    Intereting Posts