Как использовать мультисвязывание в ширину кнопки - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать 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 Ответ

0 голосов
/ 14 февраля 2019

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

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    return 40d;
}
...