2010-06-21 19 views
1

Quelle est la différence entre l'utilisation d'un convertisseur (IValueConverter) et la transmission d'autres valeurs en tant que paramètres (ConverterParameter) par rapport à l'utilisation d'un MultiConverter (IMultiValueConverter) et en transmettant simplement plusieurs valeurs de convertisseur?Convertisseur WPF avec propriété vs MultiConverter?

Répondre

6

Il existe deux différences principales. La première est que ConverterParameter n'est pas une liaison et n'écoute pas les changements de propriétés, donc la liaison ne sera pas actualisée automatiquement si la valeur change.

L'autre différence est que le paramètre ConverterParameter est une entrée à la fois pour Convert et ConvertBack, alors que toutes les liaisons d'un MultiBinding sont des entrées pour Convertir et sorties de ConvertBack. Par exemple, si vous convertissez de DateTime à chaîne, vous pourriez avoir le ConverterParameter être une chaîne de format, car cela affecte la conversion dans les deux sens:

public class DateTimeConverter 
    : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((DateTime)value).ToString((string)parameter, null); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DateTime.ParseExact((string)value, (string)parameter, null); 
    } 
} 

D'autre part, si vous voulez convertir deux double à une taille, alors vous voudriez retourner deux doubles en convertissant en arrière:

public class SizeConverter 
    : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new Size((double)values[0], (double)values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     var size = (Size)value; 
     return new object[] { size.Width, size.Height }; 
    } 
}