1

What is the difference between using a Converter (IValueConverter) and passing in other values as parameters (ConverterParameter) vs using a MultiConverter (IMultiValueConverter) and just passing in multiple converter values?

4

1 回答 1

6

有两个主要区别。一是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 };
    }
}
于 2010-06-21T16:32:19.810 回答