WPF Converter con proprietà vs MultiConverter?
-
28-09-2019 - |
Domanda
Qual è la differenza tra l'utilizzo di un convertitore (IValueConverter) e passando in altri valori come parametri (ConverterParameter) vs utilizzando un MultiConverter (IMultiValueConverter) e solo di passaggio in più valori Converter?
Soluzione
Ci sono due differenze principali. Uno è che ConverterParameter non è un vincolante e non ascoltare i cambiamenti di proprietà, in modo che il rilegatura non verrà aggiornata automaticamente se il valore cambia.
L'altra differenza è che il ConverterParameter è un input sia Convertire e ConvertBack, mentre tutte le associazioni in un MultiBinding sono ingressi per convertire e uscite di ConvertBack. Ad esempio, se si sta convertendo da DateTime a stringa, si potrebbe avere la ConverterParameter essere una stringa di formato, dal momento che colpisce la conversione in entrambe le direzioni:
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'altra parte, se si desidera convertire da due doppie a una dimensione, allora si vorrebbe tornare due doppie durante la conversione di nuovo:
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 };
}
}