Silverlight Bind to inverse of boolean property value

silverlight, silverlight-3.0

Solution

This sort of question is asked so often and the answers so similar I thought its time to have a single answer to all (ok may "most") of the bool to value conversion questions. I've blogged it here.

The code is quite simple so I'll paste it here too:-

public class BoolToValueConverter<T> : IValueConverter
{
    public T FalseValue { get; set; }
    public T TrueValue { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
}

Now you can create converter to visibility with a one-liner:-

public class BoolToVisibilityConverter : BoolToValueConverter<Visibility> { }

Then for you can create an instance converter in a resource like this:-

<local:BoolToVisibilityConverter x:Key="InverseVisibility" TrueValue="Collapsed" FalseValue="Visible" />

Note the `TrueValue` and `FalseValue` are the swapped around from the more natural order giving you the inverted logic you wanted. With this in the `Resources` in your `UserControl` or even App.xaml you can now use it to bind to the `CanDownload` property to `TextBox` `Visibility` property:-

<TextBox Visibility="{Binding CanDownload, Converter={StaticResource InverseVisibility}}" />

Problem

I want to bind a controls visibility to inverse of boolean property value. I have a property CanDownload, if it is true then I want to hide textbox and vice versa. How can I achieve this? Thanks

Original source