This article has been localized into Italian by the community.
Conversione di valori tramite IValueConverter
Finora abbiamo utilizzato alcuni semplici data bindings, in cui la proprietà di invio e ricezione era sempre compatibile. Tuttavia, ti imbatterai presto in situazioni dove si desidera utilizzare un bound value di un tipo e quindi presentarlo in modo leggermente diverso.
Quando utilizzare un value converter
I value converters sono utilizzati frequentemente con i data bindings. Ecco alcuni esempi di base:
- Hai un valore numerico ma vuoi che gli zero vengano visualizzati in un modo e i numeri positivi in un altro
- Vuoi spuntare un CheckBox in base ad un valore ma il valore è una stringa, come "sì" o "no", invece di essere un valore Boolean
- Hai la dimensione di un file in bytes ma desideri mostrarla in bytes, kilobytes, megabytes o gigabytes in base a quanto sia grande
Questi sono alcuni dei casi semplici, ma ce ne sono molti altri. Ad esempio, potresti voler selezionare una casella di controllo in base a un valore booleano, ma tu lo vuoi invertito, in modo che il CheckBox sia spuntato se il valore è falso e non spuntato se il valore è vero. È anche possibile utilizzare un convertitore per generare un'immagine per un ImageSource, basato sul valore, come un segno verde per true o un segno rosso per false - le possibilità sono praticamente infinite!
Per casi come questo, è possibile utilizzare un convertitore di valori. Queste piccole classi, che implementano l'interfaccia IValueConverter, agiranno come intermediari e tradurranno un valore tra l'origine e la destinazione. Quindi, in qualsiasi situazione in cui sia necessario trasformare un valore prima che raggiunga la sua destinazione o di nuovo alla sua fonte, probabilmente hai bisogno di un convertitore.
Implementare un semplice convertitore di valore
Come accennato, un convertitore di valori deve implementare l’interfaccia IValueConverter o, in alternativa, l’interfaccia IMultiValueConverter. Entrambe le interfacce richiedono solo l’implementazione di due metodi: Convert() e ConvertBack(). Come suggeriscono i nomi, questi metodi verranno utilizzati per convertire un valore nel formato di destinazione e di nuovo indietro.
Implementiamo un semplice convertitore che accetti una stringa come input e quindi restituisca un valore booleano, ed il contrario. Se sei nuovo a WPF, è probabile che tu stia leggendo questo tutorial, quindi potresti non conoscere tutti i concetti usati nell'esempio, ma non preoccuparti, saranno tutti spiegati dopo i listati del codice:
<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
Title="ConverterSample" Height="140" Width="250">
<Window.Resources>
<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
</Window.Resources>
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Current value is: " />
<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
</WrapPanel>
<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;
namespace WpfTutorialSamples.DataBinding
{
public partial class ConverterSample : Window
{
public ConverterSample()
{
InitializeComponent();
}
}
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch(value.ToString().ToLower())
{
case "yes":
case "oui":
return true;
case "no":
case "non":
return false;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if(value is bool)
{
if((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
}
Code-behind
Quindi, partiamo dall'inizio e poi proseguiamo nell'esempio. Abbiamo implementato un convertitore nel file Code-behind chiamato YesNoToBooleanConverter. Come spiegato, implementa semplicemente i due metodi richiesti, chiamati Convert () e ConvertBack (). Il metodo Convert () presuppone di ricevere in input una stringa (il parametro value) e quindi la converte in un valore booleano true o false, con un valore di fallback di false. Per divertimento, ho aggiunto la possibilità di effettuare questa conversione anche da parole francesi.
Il metodo ConvertBack(), ovviamente, fa l’opposto: si aspetta come input un valore booleano e restituisce la parola “yes” o “no”, con valore di fallback “no”.
Potresti farti domande riguardo ai parametri aggiuntivi che questi due metodi utilizzano, non sono necessari in questo esempio. Li utilizzeremo in uno dei prossimi capitoli, dove verranno spiegati.
XAML
Nella parte XAML del programma, iniziamo dichiarando un'istanza del nostro convertitore come risorsa per la finestra. Abbiamo quindi un TextBox, un paio di TextBlocks ed un controllo CheckBox ed è qui dove stanno accadendo cose interessanti: leghiamo il valore del TextBox a TextBlock ed al Controllo CheckBox, ed utilizzo la proprietà Converter e del nostro riferimento al convertitore, manipolando i valori avanti e indietro tra una stringa e un valore booleano, a seconda delle necessità.
Se si tenta di eseguire questo esempio, sarà possibile modificare il valore in due punti: scrivendo "sì" nel TextBox (o qualsiasi altro valore, se si desidera falso) o cliccando sul CheckBox. Qualunque cosa tu faccia, la modifica si rifletterà nell'altro controllo e nel TextBlock.
Sommario
Questo era un esempio di un semplice convertitore di valori, reso un po 'più lungo del necessario per scopi illustrativi. Nel prossimo capitolo esamineremo un altro esempio avanzato, ma prima di uscire e scrivere il proprio convertitore, è possibile controllare se WPF ne include già uno per lo scopo. Al momento in cui scrivo ci sono più di 20 convertitori incorporati che puoi sfruttare, ma devi conoscerne il loro nome. Ho trovato il seguente elenco che potresti tenere a portata di mano: http://stackoverflow.com/questions/505397/built-in-wpf-ivalueconverters