StringFormat WPF sul contenuto dell’etichetta

Voglio formattare il mio binding di stringhe come Amount is X dove X è una proprietà legata a un’etichetta.

Ho visto molti esempi ma quanto segue non funziona:

  

Ho anche provato queste combinazioni:

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

Ho anche provato a modificare il tipo di dati della proprietà di associazione su int , string e double . Niente sembra funzionare. Questo è un caso d’uso molto comune ma non sembra essere supportato.

Il motivo per cui questo non funziona è che la proprietà Label.Content è di tipo Object e Binding.StringFormat viene utilizzato solo quando si Binding.StringFormat a una proprietà di tipo String .

Quello che sta succedendo è:

  1. Il Binding sta inscatolando il valore MaxLevelOfInvestment e memorizzandolo come valore decimale in scatola come proprietà di Label.Content .
  2. Il controllo Label ha un modello che include un ContentPresenter .
  3. Poiché ContentTemplate non è impostato, ContentPresenter cerca un DataTemplate definito per il tipo Decimal . Quando non ne trova, utilizza un modello predefinito.
  4. Il modello predefinito utilizzato da ContentPresenter presenta stringhe utilizzando la proprietà ContentPresenter dell’etichetta.

Sono possibili due soluzioni:

  • Utilizzare Label.ContentStringFormat anziché Binding.StringFormat o
  • Utilizzare una proprietà String come TextBlock.Text anziché Label.Content

Ecco come utilizzare Label.ContentStringFormat:

  

Ecco come usare un TextBlock:

  

Nota: per semplicità ho omesso un dettaglio nella spiegazione di cui sopra: ContentPresenter utilizza effettivamente le proprie proprietà Template e StringFormat , ma durante il caricamento vengono automaticamente associate al modello alle proprietà ContentTemplate e ContentStringFormat Label , quindi sembra che ContentPresenter sta effettivamente usando le proprietà Label .

Ho appena controllato e per qualche ragione non funziona con l’etichetta, probabilmente perché usa un ContentPresenter per la proprietà Content internamente. Puoi usare invece un TextBlock e questo funzionerà. Puoi anche inserire l’estratto di TextBlock qui sotto nel contenuto di un’etichetta se hai bisogno di ereditare lo stile, il comportamento ecc.

 
		      	

Crea un StringFormatConverter : IValueConverter universale StringFormatConverter : IValueConverter . Passa la stringa di formato come ConverterParameter .

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

Inoltre, crea StringFormatMultiConverter : IMultiValueConverter quando hai bisogno di più di un object nella stringa di formato, ad esempio, Completed {0} tasks out of {1} .

Prova ad usare un convertitore ….

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

Forse questo aiuterà …

Incorpora codice in XAML