Gestione dei dati in Data Binding in Silverlight 2.0: Converters

di Alessio Leoncini, in Silverlight 2.0,

Le funzionalità di Data Binding consentono una buona separazione tra le sorgenti dati e la loro visualizzazione nelle interfacce utente, definendo direttamente nel markup il nome dei campi degli oggetti associati a ciascun controllo.

Text="{Binding Path=Title}"
Con questa modalità l'engine di Data Binding risolve autonomamente il tipo di dato sorgente cercando di rispettare il tipo accettato dalla Dependency Property del controllo, Text nello snippet precedente, applicando i Converter predefiniti.

Qualora ci sia l'esigenza di manipolare i dati in Binding, come ad esempio per una renderizzazione diversa, è possibile realizzare classi Converter personalizzate in modo da modificare il valore da associare al controllo lasciando inalterato il dato originale.
Tali classi devono implementare l'interfaccia IValueConverter:

public class TitleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Per il loro utilizzo nel markup esse devono essere registrate come risorse statiche previa registrazione dello xml namespace specifico per la classe:

<UserControl x:Class="ASPItalia.ImageGallery.MediaItem"            
             xmlns:MediaItem="clr-namespace:ASPItalia.ImageGallery"
             Cursor="Hand">
    <UserControl.Resources>
    <MediaItem:TitleConverter x:Key="TitleConverter"></MediaItem:TitleConverter>
</UserControl.Resources>
In questo modo è possibile impiegarle direttamente nella Binding Markup Extension:

Text="{Binding Path=Title, Converter={StaticResource TitleConverter}}"
Tali classi IValueConverter consentono un'incredibile flessibilità nel ciclo di gestione del Data Binding, attraverso i parametri a disposizione nel metodo Convert è possibile descrivere l'aspetto o il comportamento dell'interfaccia utente direttamente nel markup. In questo modo ad esempio anche un designer può concentrarsi solo sulla progettazione grafica senza che la logica applicativa lo vincoli o debba essere aggiornata alle proprie necessità:

Text="{Binding Path=Title, Converter={StaticResource TitleConverter}, ConverterParameter=20}"public class TitleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int _lenght = 0;
        string _strLenght = parameter as string;
        if (_strLenght != null)
            int.TryParse(_strLenght, out _lenght);

        string _value = value as string;
        if (_value != null && _lenght > 0 && _value.Length >= _lenght)
        {
            _value = _value.Substring(0, _lenght);
            _value = String.Format("{0}..", _value);
        }
        return _value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //implementazione specifica per il binding two-way
        throw new NotImplementedException();
    }
}

Con questa semplice classe TitleConverter, il ConverterParameter definisce quando il testo "Title" debba essere esteso e troncato posponendo due puntini "..". La possibilità di definire il valore direttamente nel markup aggiunge velocità allo sviluppo ed alla manutenzione del progetto.

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

I più letti di oggi