Converter typé en wpf ou silverlight

Contenu du snippet

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;
		}	
	}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.