Wahored
Wahored

Reputation: 55

BooleanToVisibilityConverter that converts to Visible when true or null and Collapsed when false

I do some binding between a ThreeState ToggleButton and a normal button

that's what I'm trying to achieve:

button#1 Visible if button#2 IsChecked=True or Null

button#1 Collapsed if button#2 IsChecked=False

The built-in BooleanToVisibilityConverter shows the button only when true.

I would be very grateful if you could help with the Converter. Thanks

Upvotes: 2

Views: 1588

Answers (2)

HYA
HYA

Reputation: 189

And without BooleanToVisibilityConverter, only XAML :

<Window.Resources>
    <Style TargetType="Button">
        <Setter Property="Visibility"
                Value="Visible" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=chk1, Path=IsChecked}"
                         Value="False">
                <Setter Property="Visibility"
                        Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Button Content="Button"
            HorizontalAlignment="Left"
            Margin="34,68,0,0"
            VerticalAlignment="Top"
            Width="75" />
    <CheckBox x:Name="chk1"
              Content=" Toggle"
              HorizontalAlignment="Left"
              Margin="34,29,0,0"
              VerticalAlignment="Top"
              IsThreeState="True"
              IsChecked="True" />
</Grid>

Upvotes: 1

BionicCode
BionicCode

Reputation: 29018

This is ridiculously simple. The following IValueConverter returns Visibility.Visible when value is either true or null:

public sealed class BooleanToVisibilityConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return value is bool bValue && bValue 
      || value == null 
        ? Visibility.Visible 
        : Visibility.Collapsed;
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return value is Visibility visibility 
      && visibility == Visibility.Visible;
  }
}

Upvotes: 2

Related Questions