Un generico IValueConverter per trasformare valori booleani in altri oggetti in Silverlight 4.0

di Alessio Leoncini, in Silverlight 4.0,

Nello script #37 (https://www.silverlightitalia.com/script/37/Gestione-Dati-Data-Binding-Silverlight-2.0-Converters.aspx) abbiamo visto come sia possibile gestire i valori in binding in modo da associarli ad una proprietà di un controllo, lasciando inalterato il dato originale.

Nell'utilizzo quotidiano è frequente avere proprietà booleane di entità che influenzano grafica e comportamenti come visibilità, colore o altro. Se realizziamo un IValueConverter per ogni scenario è molto probabile che il progetto si affolli di molte classi di codice molto simile. Per ridurre gli oggetti da mantenere possiamo sfruttare i generics e inserire delle proprietà al nostro converter, in modo da specifiare l'oggetto da restituire in funzione di un valore True o False.

Nello snippet seguente vediamo il codice di tale converter:

public class BoolToValueConverter<T> : IValueConverter
{
  public T FalseValue { get; set; }
  public T TrueValue { get; set; }

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    T returnValue;
    if (value == null)
    {
      returnValue = FalseValue;
    }
    else
    {
      bool innerValue = (bool)value;
      if (innerValue)
      {
        returnValue = TrueValue;
      }
      else
      {
        returnValue = FalseValue;
      }
    }
    return returnValue;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (value != null)
    {
      return value.Equals(TrueValue);
    }
    else
    {
      return false;
    }
  }
}

Per utilizzarlo è sufficiente estendere la classe con una che specifichi il tipo di oggetto gestito:

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility>{ }

Come di consueto dobbiamo registrare l'oggetto tra le risorse, specificando i valori nelle proprietà TrueValue e FalseValue che abbiamo aggiunto:

<UserControl.Resources>
  <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"
    TrueValue="Visible"
    FalseValue="Collapsed" />

L'utilizzo non differisce dai converter tradizionali:

Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibilityConverter}}"

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