1

コンバーター(IValueConverter)を使用して他の値をパラメーター(ConverterParameter)として渡すことと、MultiConverter(IMultiValueConverter)を使用して複数のコンバーター値を渡すことの違いは何ですか?

4

1 に答える 1

6

2つの主な違いがあります。1つは、ConverterParameterがバインディングではなく、プロパティの変更をリッスンしないため、値が変更されてもバインディングが自動的に更新されないことです。

もう1つの違いは、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);
    }
}

一方、2つのダブルからサイズに変換する場合は、元に戻すときに2つのダブルを返す必要があります。

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 に答える