Конвертер WPF со свойством против MultiConverter? - PullRequest
1 голос
/ 21 июня 2010

В чем разница между использованием конвертера (IValueConverter) и передачей других значений в качестве параметров (ConverterParameter) по сравнению с использованием MultiConverter (IMultiValueConverter) и просто передачей нескольких значений конвертера?

1 Ответ

6 голосов
/ 21 июня 2010

Есть два основных различия. Один из них заключается в том, что ConverterParameter не является Binding и не прослушивает изменения свойств, поэтому Binding не будет обновляться автоматически при изменении значения.

Другое отличие состоит в том, что ConverterParameter является входом для Convert и ConvertBack, в то время как все привязки в MultiBinding являются входами для Convert и выходами ConvertBack. Например, если вы конвертируете из DateTime в строку, то у ConverterParameter может быть строка формата, поскольку это влияет на преобразование в обоих направлениях:

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

С другой стороны, если вы хотите конвертировать из двух двойных в размер, тогда вы захотите вернуть два двойных при обратном преобразовании:

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