Les converters sont des outils très pratiques à utiliser. Toutefois, la majorité du temps, on l'utilise un type bien défini en entrée et un type bien défini en sortie. Lors de la création de ce type de converter,il est nécessaire de vérifier les types d'entrée /sortie avant la conversion en elle même.
Ce code source propose une classe TypedConverter permettant de créer un converter en précisant ces types d'entrée / sortie. Le TypedConverter vérifie les types (lançant des exceptions si le type n'est pas conforme). Ainsi, le code des converters ne sera uniquement constitué par la logique de conversion.
Vous trouverez aussi une classe BoolToVisibilityConverter utilisant cette classe TypedConveter. Le code ne contient que la logique de conversion.
Je parle de cela sur mon blog :
http://sebastiencourtois.wordpress.com/2009/03/18/silverlight-2-les-converters-typs/
Source / Exemple :
public abstract class TypedConverter<VType,TType> : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Vérification du type d'entrée
if (!(value is VType))
throw new InvalidOperationException("La paramètre d'entrée doit être de type "+ typeof(VType));
//Vérification du type de sortie
if(!this.IsTargetType(targetType,typeof(TType)))
throw new InvalidOperationException("La type de sortie doit être de type " + typeof(TType));
return this.Convert((VType)value, culture);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Vérification du type d'entrée
if (!(value is TType))
throw new InvalidOperationException("La paramètre d'entrée doit être de type " + typeof(VType));
//Vérification du type de sortie
if (!this.IsTargetType(targetType, typeof(VType)))
throw new InvalidOperationException("La type de sortie doit être de type " + typeof(TType));
return this.ConvertBack((TType)value, culture);
}
#endregion
protected abstract TType Convert(VType p, CultureInfo culture);
protected abstract VType ConvertBack(TType p, CultureInfo culture);
//Méthode recherchant un type correspondant dans la hierarchie des classes
private bool IsTargetType(Type targetType, Type type)
{
while(targetType != null)
{
if (targetType == type)
return true;
targetType = targetType.BaseType;
}
return false;
}
}
public class BoolToVisibilityConverter : TypedConverter<bool,Visibility>
{
public bool Invert { get; set; }
protected override Visibility Convert(bool value, CultureInfo culture)
{
if (this.Invert)
return (bool)value ? Visibility.Collapsed : Visibility.Visible;
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
protected override bool ConvertBack(Visibility value, CultureInfo culture)
{
if (this.Invert)
return value == Visibility.Collapsed ? true : false;
return value == Visibility.Visible ? true : false;
}
}