Search code examples
wpfbindingwidthivalueconverter

WPF binding IValueConverter and the width of another control



The following code worked fine. There was an error elsewhere in the code. Still, the advice given is good.


I am trying to bind the Width of a TextBox to a percentage of the Width of a parent control. I know I can accomplish something similar by simply setting a Margin, but I was wondering why this doesn't work.

First, I set a reference to an IValueConverter in the resources collection of my user control:

<UserControl.Resources>
    <local:TextBoxWidthConverter x:Key="txtWidthConv" />
</UserControl.Resources>

In the main xaml, I have the following:

<StackPanel Name="parentPanel" Width="300">
  <ScrollViewer HorizontalScrollBarVisibility="Auto"    
       VerticalScrollBarVisibility="Hidden" Name="scroller" Width="{Binding Width,    
       ElementName=parentPanel, Converter={StaticResource txtWidthConv}}">           
     <StackPanel Orientation="Horizontal">
       <TextBox></TextBox>
     </StackPanel>
   </ScrollViewer>
</StackPanel>

The ivalueconverter looks like this:

public class TextBoxWidthConverter : IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double result = (double)value;

        if (!Double.IsNaN(result))
        {
            result = result * .25;
        }
        else
        {
            result = 100D;
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new System.NotImplementedException("Not implemented.");
    }

    #endregion
}

Setting the width property does nothing here, let alone setting the IValueConverter. I would expect the ScrollViewer to be 1/4 the width of the parent StackPanel.


Solution

  • Set the ScrollViewer's HorizontalAlignment to something other than Stretch.

    Also, you should bind to the ActualWidth property.