Почему MultiBinding не работает для CornerRadius - PullRequest
2 голосов
/ 03 марта 2012

Если я использую IValueConverter, он работает, в то время как IMultiValueConverter возвращает то же значение, что и нет, почему?

<Border Background="Red" Width="100" Height="100"
        CornerRadius="{Binding Converter={vc:SingleAndMultiConverter}}" />
<Border Background="Red" Width="100" Height="100"
        CornerRadius="{MultiBinding Converter={vc:SingleAndMultiConverter}}" />
public class SingleAndMultiConverter : MarkupExtension, IValueConverter, IMultiValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Convert();
    }
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Convert();
    }
    private object Convert()
    {
        return 15;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Мульти-связывание выдает эту ошибку:

Значение, созданное BindingExpression, недопустимо для целевого свойства .; Значение = '15'

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Border.CornerRadius относится к типу CornerRadius. Преобразователи значений всегда должны возвращать правильный тип свойства.

Трудно сказать, почему они ведут себя по-разному, возможно, по умолчанию не используется преобразование значений по умолчанию с использованием преобразователей типа при использовании множественного связывания по необъяснимой причине. Если бы вы покопались в исходном коде, вы могли бы что-то найти, но это, вероятно, не будет приятным путешествием.

0 голосов
/ 04 марта 2012

Что сказал HB + 1

[ValueConversion(typeof(object[]),typeof(CornerRadius))]
public class Multi : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return new CornerRadius(Double.Parse("15"));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}
...