Search code examples
wpfgridbindinggridsplitter

Wpf GridSplitter replaces binding on row.height property


I'm having a hard time with grid splitter. I've bound the RowDefinition.Height dependency property to the clr property of the model as presented below.


    <Grid.RowDefinitions>
        <RowDefinition Height='{Binding Path=Height, Mode=OneWay}' />
        <RowDefinition Height='*' />
    </Grid.RowDefinitions>

This works fine just until the GridSplitter is used. When the height of the row is changed manually with GridSplitter, it replaces the binding with the new fixed size (and removes the binding).

Have you got any ideas or workarounds how to create two rows that would be resizable with GridSplitter but still change their height according to the clr property/binding?


Solution

  • I think the problem is that your source Property Height is of type double and RowDefinition.Height is of type GridLength. Use a converter and it'll work TwoWay

    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding Path=Height,
                                        Mode=TwoWay,
                                        Converter={StaticResource DoubleGridLengthConverter}}"/>
        <!--...-->
    </Grid.RowDefinitions>
    

    DoubleGridLengthConverter

    public class DoubleGridLengthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return new GridLength((double)value);
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            GridLength gridLength = (GridLength)value;
            return gridLength.Value;
        }
    }
    

    Update
    Uploaded my sample application here: http://www.mediafire.com/download.php?pgibb205d65596q

    Set the RowDefinition.Height by entering a value in the lower TextBox and resize the RowDefinition.Height with the GridSplitter