xaml
Convertitori
Ricerca…
Parametri
| Parametro | Dettagli |
|---|---|
| valore | Il valore da convertire da |
| targetType | Il tipo di conversione |
| parametro | Valore opzionale per controllare come funziona la conversione |
| cultura | Oggetto CultureInfo: richiesto se la localizzazione è necessaria |
Osservazioni
Il metodo Convert converte il valore dall'origine (in genere il modello di visualizzazione) alla destinazione (di solito una proprietà di un controllo).
Il metodo ConvertBack converte il valore dalla destinazione alla fonte. È necessario solo se l'associazione è TwoWay o OneWayToSource .
Quando un ConvertBack non è supportato, ovvero non esiste un mapping uno a uno tra il valore di pre-conversione e il valore di post-conversione, è prassi comune che il metodo ConvertBack restituisca DependencyProperty.UnsetValue . È un'opzione migliore rispetto al lancio di un'eccezione (ad es. NotImplementedException ) in quanto evita errori di runtime imprevisti. Inoltre, i binding possono beneficiare del loro FallbackValue quando DependencyProperty.UnsetValue viene restituito da un convertitore.
String to IsChecked Converter
In XAML:
<RadioButton IsChecked="{Binding EntityValue, Mode=TwoWay,
Converter={StaticResource StringToIsCheckedConverter},
ConverterParameter=Male}"
Content="Male"/>
<RadioButton IsChecked="{Binding EntityValue, Mode=TwoWay,
Converter={StaticResource StringToIsCheckedConverter},
ConverterParameter=Female}"
Content="Female"/>
La classe C #:
public class StringToIsCheckedConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string input = (string)value;
string test = (string)parameter;
return input == test;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || !(value is bool))
{
return string.Empty;
}
if (parameter == null || !(parameter is string))
{
return string.Empty;
}
if ((bool)value)
{
return parameter.ToString();
}
else
{
return string.Empty;
}
}
}
Convertitori 101
I controlli XAML possono avere proprietà di dipendenza che possono essere associate a oggetti da DataContext o altri controlli. Quando il tipo di oggetto associato è diverso dal tipo di DependencyProperty target, è possibile utilizzare un convertitore per adattare un tipo a un altro.
I convertitori sono classi che implementano System.Windows.Data.IValueConverter o System.Windows.Data.IMultiValueConverter ; WPF implementa alcuni convertitori out of the box, ma gli sviluppatori potrebbero vedere l'uso nelle implementazioni personalizzate, come spesso accade.
Per utilizzare un convertitore in XAML, un'istanza può essere istanziata nella sezione Resources . Per l'esempio seguente, verrà utilizzato System.Windows.Controls.BooleanToVisibilityConverter :
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</UserControl.Resources>
Si noti x:Key Elemento x:Key definito, che viene quindi utilizzato per fare riferimento all'istanza di BooleanToVisibilityConverter nel BooleanToVisibilityConverter :
<TextBlock Text="This will be hidden if property 'IsVisible' is true"
Visibility="{Binding IsVisible,
Converter={StaticResource BooleanToVisibilityConverter}}"/>
Nell'esempio sopra, una proprietà IsVisible booleana viene convertita in un valore dell'enumerazione System.Windows.Visibility ; Visibility.Visible se vero o Visibility.Collapsed altrimenti.
Creazione e utilizzo di un convertitore: BooleanToVisibilityConverter e InvertibleBooleanToVisibilityConverter
Per estendere ed espandere l'esperienza di collegamento abbiamo convertitori per convertire un valore di un tipo in un altro valore di un altro tipo. Per sfruttare i convertitori in un Databinding devi prima creare una classe DataConverter che possa estendere
-
IValueConverter(WPF e UWP)
o
-
IMultiValueConverter(WPF)
se vuoi convertire più tipi in un solo tipo
In questo caso ci concentriamo sulla conversione di un valore boolean True/False sul correspioning Visibility Visibility.Visible e Visibility.Collapsed :
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (value is bool && (bool) value) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (value is Visibility && (Visibility) value == Visibility.Visible);
}
}
Il Convert metodo viene chiamato ogni volta che si GET dati DA FROM ViewModel .
Il ConvertBack è chiamato SET ing dati TO la ViewModel per BindingMode.TwoWay attacchi.
public class InvertibleBooleanToVisibilityConverter : IValueConverter
{
public bool Invert { get; set; } = false;
public object Convert(object value, Type targetType, object parameter, string language)
{
return (value is bool && (bool) value != Invert) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (value is Visibility && ((Visibility) value == Visibility.Visible) != Invert);
}
}
Se si desidera utilizzare un convertitore in un Binding , dichiararlo semplicemente come risorsa nella pagina, finestra o altro elemento, assegnargli una chiave e fornire le proprietà potenzialmente necessarie:
<Page ...
xmlns:converters="using:MyNamespce.Converters">
<Page.Resources>
<converters:InvertibleBooleanToVisibilityConverter
x:Key="BooleanToVisibilityConverter"
Invert="False" />
</Page.Resources>
e usarlo come StaticResource in una rilegatura:
<ProgressRing
Visibility="{Binding ShowBusyIndicator,
Converter={StaticResource BooleanToVisibilityConverter},
UpdateSourceTrigger=PropertyChanged,
Mode=OneWay}" />