With the following XAML the bottom row hides when you uncheck the checkbox. Everything is well until you resize it with the gridsplitter. Then checking/unchecking the checkbox doesn't do anything. Given that the converter sets the Height to 0 I expected the row to hide. What's going on? How can I reset the heights after moving the splitter?
<Grid>
<Grid.Resources>
<m:CheckedToLengthConverter x:Key="checkedToLengthConverter" />
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="3*" />
<RowDefinition Height="{Binding Mode=OneWay, ElementName=ShowBottomCheckBox, Path=IsChecked, Converter={StaticResource checkedToLengthConverter}, ConverterParameter=2}" />
</Grid.RowDefinitions>
<Border Background="Blue" />
<CheckBox Name="ShowBottomCheckBox" IsChecked="True" />
<GridSplitter HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="5" />
<Border Background="Red" Grid.Row="1" />
</Grid>
Converter:
public class CheckedToLengthConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((bool)value)
return new GridLength(int.Parse(parameter.ToString()), GridUnitType.Star);
return new GridLength(0, GridUnitType.Pixel);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
The problem is that once you move the splitter the first row will have an explicit width, so setting the last row back to * won't have any effect. After some experimentation I came up with the code below. Note that you need to specify a TwoWay binding or it won't work.
public class CheckedToLengthConverter : MarkupExtension, IValueConverter
{
public GridLength TrueValue { get; set; }
public GridLength FalseValue { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Convert.ToBoolean(value) ? TrueValue : FalseValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
#region Overrides of MarkupExtension
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
#endregion
}
<Grid>
<Grid.Resources>
<m:CheckedToLengthConverter TrueValue="2*" FalseValue="*" x:Key="c1" />
<m:CheckedToLengthConverter TrueValue="3*" FalseValue="0" x:Key="c2" />
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Mode=TwoWay, Path=IsChecked,
ElementName=ShowBottomCheckBox,
Converter={StaticResource c1}}"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="{Binding Mode=TwoWay, Path=IsChecked,
ElementName=ShowBottomCheckBox,
Converter={StaticResource c2}}"/>
</Grid.RowDefinitions>
<Border Background="Blue" />
<CheckBox Name="ShowBottomCheckBox" IsChecked="True" />
<GridSplitter HorizontalAlignment="Stretch"
Grid.Row="1" VerticalAlignment="Bottom" Height="5"
ResizeBehavior="PreviousAndNext" />
<Border Background="Red" Grid.Row="2" />
</Grid>
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