Как использовать мультисвязывание в ширину кнопки
Я пытаюсь использовать 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;
}