FallbackValue e NullToUnsetConverter per il Binding di WPF

di Cristian Civera, in Windows Presentation Foundation, XAML,

Lo script corrente segue il #29 della settimana scorsa, proponendo un ulteriore converter utile quando si sviluppano applicazioni WPF. L'esigenza deriva dal fatto che quando l'oggetto di Binding carica una proprietà da qualsiasi sorgente, se questa non ha valore, nessun testo o numero viene visualizzato. Purtroppo il termine "non ha valore" nel .NET Framework vuol dire più cose: per i tipi di valori come numeri e date può essere una costante, per tipi di riferimenti, quindi classi o stringhe può essere il puntatore null, mentre nel caso delle DependencyProperty e quindi per WPF, è rappresentato dalla costante DependencyProperty.UnsetValue.

Il motore di Binding attraverso la classe base BindingBase (sono coinvolte quindi Binding, MultiBinding e PriorityBinding) espone con la proprietà FallbackValue la possibilità di caricare un valore alternativo nel caso la proprietà in binding restituisca UnsetValue.
Ecco un semplice esempio che ne fa uso mostrando la dicitura "(nessuno)":

<TextBlock Text="{Binding Path=MiaProprieta,Source=MiaSource,FallbackValue='(nessuno)'}" />

Questa funzionalità è molto comoda e permette di non ricorrere all'uso di codice. L'unico difetto risiede nel fatto che non tutte le proprietà danno UnsetValue, ma spesso un valore null.
E' possibile rimediare a questo problema scrivendo un converter che trasformi qualsiasi valore nullo nella costante che fa poi scatenare il FallbackValue. Si scrive quindi una classe che implementa IValueConverter e semplicemente controlla il valore da convertire:

public class NullToUnsetConverter : IValueConverter
{

    #region IValueConverter Members

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value ?? DependencyProperty.UnsetValue);
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }

    #endregion
}

Questa classe poi può essere utilizzata una o più volte istanziandola dapprima tra le risorse e poi usandola in fase di binding:

<Window
    xmlns:u="clr-namespace:WinFXItalia.Scripts.Converters">
    <Window.Resources>
        <u:NullToUnsetConverter x:Key="nullToUnsetConverter" />
    </Window.Resources>
    <TextBlock Text="{Binding Path=MiaProprieta,Source=MiaSource,FallbackValue='(nessuno)',Converter={StaticResource nullToUnsetConverter}}" />
</Window>

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