I have a problem binding the "width" property of a border control. When i bind it with a constant, the change is reflected in runtime, but when i bound it with a converter fails, even if the converter return the same value than the constant.
Here is the user control. The problem is with the "Border" object. If i do this, the control works as spected:
 <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>

but if i do this, the control fails. The converter executes the correct number of times, and the parameters are ok, but it fails even if i hardcode a return value:
<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>
and here is the converter:
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();
    }
}

Any help is apreciated. Thank you in advance.
If you run this example in Debug, the Output window in visual studio will show you the following error:
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='100' MultiBindingExpression:target element is 'Border' (Name=''); target property is 'Width' (type 'Double')
The error text explains the issue, the value returned by your Converter is not Double. Change your return statement to return 100.0;  and see the result.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With