将width属性绑定到multibinding会给出宽度为零的宽度

时间:2013-12-23 12:54:51

标签: .net wpf wpf-controls

我在绑定边框控件的“width”属性时遇到问题。当我用常量绑定它时,变化反映在运行时,但是当我用转换器绑定它失败时,即使转换器返回的值与常量相同。

这是用户控件。问题在于“边界”对象。如果我这样做,控件的工作原理如下:

 <UserControl.Resources>
        <DataTemplate x:Key="DataTemplateHeat">
            <Border Margin="1,0,0,0" BorderBrush="Black" BorderThickness="1" Width="100">
            </Border>
        </DataTemplate>
    </UserControl.Resources>
    <DockPanel>
        <ItemsControl x:Name="CnvHeats" ItemsSource="{Binding}" ItemTemplate="{StaticResource  DataTemplateHeat}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Background="Red" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DockPanel>
</UserControl>

Espected result

但如果我这样做,控件就会失败。转换器执行正确的次数,参数正常,但即使我硬编码返回值也失败:

<UserControl.Resources>
        <DataTemplate x:Key="DataTemplateHeat">
            <Border Margin="1,0,0,0" BorderBrush="Black" BorderThickness="1">
                <Border.Width>
                    <MultiBinding Converter="{StaticResource proportionalWidthConverter}" >
                        <Binding Mode="OneWay" Path="GraphProportion"  />
                        <Binding Mode="OneWay" Path="ActualWidth" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type StackPanel}, AncestorLevel=1}"/>
                    </MultiBinding>
                </Border.Width>
            </Border>
        </DataTemplate>
    </UserControl.Resources>
    <DockPanel>
        <ItemsControl x:Name="CnvHeats" ItemsSource="{Binding}" ItemTemplate="{StaticResource  DataTemplateHeat}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Background="Red" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DockPanel>
</UserControl>

这是转换器:

public class ProportionalWidthConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return 100;
    }

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

Fail control result

任何帮助都是相关的。提前谢谢。

1 个答案:

答案 0 :(得分:3)

如果在Debug中运行此示例,Visual Studio中的“输出”窗口将显示以下错误:

  

System.Windows.Data错误:5:BindingExpression生成的值对目标属性无效。 Value ='100'MultiBindingExpression:目标元素是'Border'(Name =''); target属性是'Width'(类型'Double')

错误文字说明了问题,转换器返回的值不是Double。将您的退货单更改为return 100.0;并查看结果。