WPF: dal DataBinding ai Template - Seconda parte

5 pagine in totale: <<Indietro 1 2 3 4 [5]

Convertire i valori in Binding

Dal punto di vista puramente estetico visualizzare il valore enumerato sotto forma di stringa, non è certo il massimo e sicuramente un grafico pignolo obbietterà questa scelta. Per porre freno a qualsiasi velleità artistica del grafico di turno, decidiamo di visualizzare un'immagine, ma come convertire il valore enumerato in un percorso di un'immagine valido?

Il sistema di Binding di WPF, consente per tutti gli scenari, dove sorgente dati e destinazione non sono compatibili, di impostare un particolare oggetto che implementi IValueConverter con il compito di convertire i tipi incompatibili.

L'interfaccia dichiara due metodi Convert e ConvertBack, per convertire rispettivamente dal tipo della sorgente dati al tipo della proprietà destinazione e vice versa.
I due metodi presentano la medesima firma: il primo parametro rappresenta il valore proveniente dalla sorgente dati, il secondo è il tipo destinazione, il terzo e il quarto rispettivamente gli eventuali parametri passati al convertitore e la cultura da utilizzare.

Creiamo quindi una nuova classe, chiamata EditorPrizeValueConverter e implementiamo l'interfaccia IValueConverter che nel nostro caso ritorna il percorso di un'immagine in base al valore dell'enumeratore.

namespace MyGamePlace
{
    [ValueConversion(typeof(EditorPrize), typeof(String))]
    public class EditorPrizeValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is EditorPrize)
            {
                EditorPrize _prize = (EditorPrize)value;

                switch (_prize)
                {
                    case EditorPrize.BestSinglePlayer:
                        //un altra immagine quà
                        break;
                    case EditorPrize.BestGamePlay:
                        return @"Images\BestGamePlay.png";
                    case EditorPrize.BestMultyPlayer:
                        //un altra immagine quà
                        break;
                    default:
                        //un altra immagine quà
                        break;
                }
            }
            
            return string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

Non implementeremo il metodo ConvertBack perche non è prevista l'esecuzione del percorso inverso, cioè dal path dell'immagine recuperare il valore enumerato.

Inseriamo quindi il nostro converter tra la collezione delle risorse, sostituiamo con un Image il tipo TextBlock che visualizzava la proprietà EditorPrize, ma utilizziamo la medesima Maurkup Extension, con la sola differenza che stavolta imposteremo la proprietà Converter.

<Window.Resources>
...
<FairPlay:EditorPrizeValueConverter x:Key="EditorPrizeValueConverter"/>
...
</Window.Resources>

    <Image Grid.Row="0" Grid.Column="3"  Source="{Binding Path=EditorPrize, Converter={StaticResource EditorPrizeValueConverter}}" Height="80" />

IValueConverter in azione

Conclusione

Con questo articolo il viaggio alla scoperta del Binding di WPF è proseguito affrontando le basi sull'uso dei Template e dimostrando come sia semplice personalizzare l'aspetto delle liste. Nel prossimo articolo affronteremo particolari più avanzati sulle tecniche di Template e vedremo come personalizzare l'aspetto dei controlli.

5 pagine in totale: <<Indietro 1 2 3 4 [5]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC