In Windows Presentation Foundation l'utilizzo del Binding è certamente una delle attività più frequenti e può capitare che la normale conversione dei dati offerta del motore non basti, ma necessiti di una trasformazione particolare. Il caso più tipico è la visualizzazione di un numero o di una data sotto forma di testo . Lo script vuole proporre una classe converter standard da utilizzare in più progetti per soddisfare la maggior parte delle esigenza di formattazione. L'idea è quella di utilizzare il metodo String.Format che permette di trasformare in stringa qualsiasi oggetto che implementi l'interfaccia System.IFormattable, passando facoltativamente la formattazione da utilizzare. Per esempio, il seguente codice restituisce l'ora attuale come stringa "Data: 16/11/1981 07:00" utilizzando la formattazione "d":
string s = String.Format("Data: {0:d}", DateTime.Now);
Si costruisce quindi una classe StringFormatConverter che implementa l'interfaccia IValueConverter (System.Windows.Data) e utilizzi il ConverterParameter dell'oggetto di Binding per ricevere la formattazione:
[ValueConversion(typeof(object), typeof(string))] public class StringFormatConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // Se abbiamo ricevuto la formattazione la usiamo // altrimenti usiamo il ToString string formatString = parameter as string; if (formatString != null) return string.Format(culture, formatString, value); else return value.ToString(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // Non effettuiamo nessuna conversione inversa return null; } }
Non resta far altro che sfruttare la classe come libreria esterna o direttamente all'interno dell'applicazione. Per poter utilizzare il converter, inoltre, occorre istanziarlo all'interno delle risorse per sfruttare la medesima istanza più volte per la conversione. Di seguito un esempio di utilizzo del StringFormatConverter per formattare in percentuale un numero:
<Window xmlns:u="clr-namespace:WinFXItalia.Scripts.Converters"> <Window.Resources> <u:StringFormatConverter x:Key="stringFormatConverter" /> </Window.Resources> <TextBlock Text="{Binding Path=PercentComplete,Converter={StaticResource stringFormatConverter},ConverterParameter='Stato: \{0\}%'}" /> </Window>
Si noti dapprima l'utilizzo degli apici cosicché il parser tenga in considerazione degli spazi e in secondo luogo l'uso della \ per non confondere le graffe di formattazione con quelle delle MarkupExtension.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.