13

Nov

Value Converter in WinRT

Ciao a tutti,

in questo post vedremo come implementare i Value Converter in WinRT. Questi converter vengono usati quando, per esempio, non vogliamo mostrare le informazioni così come sono memorizzate. Andiamo subito a vedere un esempio:

Supponiamo di avere una casella di testo collegata ad una fonte dati e che vogliamo mostrare a video il testo tutto in maiuscolo senza però modificare i nostri dati memorizzati. Come prima cosa aggiungiamo la nostra TextBlock:

   1: "{Binding Name}">

Il secondo passo è creare il nostro converter da “collegare” al controllo. Per farlo dobbiamo semplicemente aggiungere una nuova classe al progetto, chiamiamola per esempio StringToUpperConverter, e gli facciamo implementare l’interfaccia IValueConverter. Se tutto è andato bene dovremmo avere una classe simile a questa:

   1: using System;
   2: using Windows.UI.Xaml.Data;
   3:  
   4: namespace App1
   5: {
   6:     class StringToUpperConverter :IValueConverter
   7:     {
   8:         public object Convert(object value, Type targetType, object parameter, string language)
   9:         {
  10:             throw new NotImplementedException();
  11:         }
  12:  
  13:         public object ConvertBack(object value, Type targetType, object parameter, string language)
  14:         {
  15:             throw new NotImplementedException();
  16:         }
  17:     }
  18: }

L’interfaccia IValueConverter dichiara due metodi: Converter e ConverterBack, rispettivamente usati per la conversione del valore memorizzato in quello visualizzato e viceversa . L’implementazione del metodo ConverterBack non è obbligatoria perché serve soltanto nella modalità TwoWay del binding. Andiamo ora ad inserire il codice necessario per trasformare la stringa in ingresso in MAIUSCOLO.

   1: using System;
   2: using Windows.UI.Xaml.Data;
   3:  
   4: namespace App1
   5: {
   6:     class StringToUpperConverter :IValueConverter
   7:     {
   8:         public object Convert(object value, Type targetType, object parameter, string language)
   9:         {
  10:             //recupero il valore in ingresso
  11:             string strInput = (string) value;
  12:             //return della stringa in MAIUSCOLO
  13:             return strInput.ToUpper();
  14:         }
  15:  
  16:         public object ConvertBack(object value, Type targetType, object parameter, string language)
  17:         {
  18:             throw new NotImplementedException();
  19:         }
  20:     }
  21: }

Perfetto, adesso prima di ritornare sulla nostra TextBlock per aggiungere il converter tramite la markup extension StaticResource , dobbiamo memorizzare la classe nelle risorse a livello di applicazione(o di pagina) . Ecco la nostra pagina completa:

   1: 
      

      
   2:     x:Class="App1.MainPage"
   3:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   4:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   5:     xmlns:local="using:App1"
   6:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   7:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   8:     mc:Ignorable="d">
   9:     
  10:         "StringToUpperConverter"/>
  11:     
  12:         "LayoutRoot" Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  13:         "{Binding Name, Converter={StaticResource StringToUpperConverter}}">
  14:     
  15: 

 

Con questo abbiamo terminato, grazie ai converter possiamo evitare di modificare il nostro modello ad oggetti solo per cambiare la UI di un determinato dato.

Ciao e alla prossima Sorriso

Carmine Punella

by Carmine Punella on 11/13/2012
Post archive