Uno StringFormatConverter per il Binding di WPF

di Cristian Civera, in Windows Presentation Foundation, XAML,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi