XAML : Les MultiBindings et MultiValueConverters
Il est souvent très pratique de faire des bindings depuis le code en XAML. Les convertisseurs sont à ce sujet très important. Ils servent par exemple pour convertir une propriété d'un type T vers un autre type U. Ils peuvent également servir pour convertir une valeur d'un type T vers une autre valeur du même type T, mais différente.
Par exemple, si vous souhaitez lier une propriété au double de la valeur d'une autre propriété, il faut utiliser un convertisseur :
public class DoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value * 2.0;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value / 2.0;
}
}
Des fois, lorsqu'on essaye d'utiliser toute la puissance du databinding avec XAML, on peut se retrouver coincé, car la valeur d'une propriété que l'on souhaiterait lier dépend de plusieurs autres propriétés. Avec un binding standard, il ne peut y avoir qu'une seule source. Il existe différentes façon de résoudre ce problème.
Mais la plus simple et la plus élégante est sans doute d'utiliser un IMultiValueConverter. Il s'agit d'un convertisseur qui prend en entrée plusieurs valeurs. En voici un exemple d'utilisation :
class HeightConverter : IMultiValueConverter
{
private const int WindowBorderSize = 16;
private VideoPlayer video;
public HeightConverter(VideoPlayer video)
{
this.video = video;
}
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double width = (double)values[0] - WindowBorderSize;
double height = (double)values[1] - WindowBorderSize;
double ratio = (double)video.Width / (double)video.Height;
double result;
if (width / ratio > height)
result = height;
else
result = width / ratio;
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new Exception("The method or operation is not implemented.");
}
}
Après, il suffit d'utiliser {MultiBinding ...} dans le code XAML, au lieu de {Binding ...}.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :