Gestione dei dati in Data Binding in Silverlight 2.0: Converters

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.

IL CONTENUTO
IN PRIMO PIANO
MEDIA
IN EVIDENZA
MISC