如何在按钮宽度中使用多重绑定

时间:2019-02-14 14:19:21

标签: c# wpf xaml binding imultivalueconverter

我正在尝试将Multibinding与XAML中具有Button控件和Width属性的转换器结合使用,但无法正常工作。

转换器是:

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并将XAML定义中的Width属性设置为40时,按钮将正确呈现。

root元素是用户控件本身,KeyHeightDependencyProperty

如何使用多重绑定设置按钮宽度?

1 个答案:

答案 0 :(得分:4)

问题不是来自多重绑定,而是来自转换器本身。在实现转换器时,期望您返回与控件期望值相同的类型(因为您是在实现转换器,所以没有隐式转换)。在这种情况下,Width属性是double,因此您应该返回相同类型的值:

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