Как использовать мультисвязывание в ширину кнопки

Я пытаюсь использовать Multibinding в сочетании с конвертером со свойством Button и свойством Width в XAML, но не могу заставить его работать.

Конвертер это:

public class ColumnsToWidthConverter: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return 40;
    }

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

Сейчас он жестко запрограммирован на 40, для целей тестирования.

Определение XAML:

<Button
    Height="{Binding ElementName=root,Path=KeyHeight}"
    FontSize="{Binding FontSize}"
    Content="{Binding Display}"
    Command="{Binding ElementName=root, Path=Command}"
    CommandParameter="{Binding}"
    Style="{StaticResource SelectedButton}">
    <Button.Width>
        <MultiBinding Converter="{StaticResource ColumnsToWidthConverter}">
            <Binding Path="Columns"/>
            <Binding Path="KeyHeight" ElementName="root"/>
        </MultiBinding>
    </Button.Width>
</Button>

Кнопка отображается из ListView и определено в ListView.ItemTemplate, При отладке приложения конвертер передается и возвращается значение 40. object[] values Параметр содержит правильные значения, переданные в путях MultiBinding. Однако ширина кнопки устанавливается в соответствии с ее содержимым, а не 40, как в примере выше.

ColumnsToWidthConverter определяется в родительском ListView.Resources

<converter:ColumnsToWidthConverter x:Key="ColumnsToWidthConverter"/>

Когда я удаляю MultiBinding и устанавливаю для свойства Width значение 40 в определении XAML, кнопка отображается правильно.

root Элемент сам пользовательский контроль и KeyHeight это DependencyProperty,

Как мне установить ширину кнопки, используя мульти-привязку?

1 ответ

Решение

Проблема не в мультисвязывании, а в самом конвертере. При реализации преобразователя ожидается, что вы вернете значение того же типа, что и элемент управления (неявное преобразование не выполняется, поскольку именно оно реализует преобразователь). В этом случае Width собственность double, поэтому вы должны вернуть значение того же типа:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    return 40d;
}
Другие вопросы по тегам