'Is there a way to bind the Enabled property of a button to a checkbox's Checked property?

I want to bind IsEnabled of Button in WPF as follows:

WPF Code:

<Button Content="TestButton" IsEnabled="{Binding ??}" />

C# code:

private MyObjectClass _Checked; 

public MyObjectClass Checked 
{ 
    get { return _Checked; } 
    set 
    { 
        _Checked = value; 
        RaisePropertyChanged("Checked"); 
    } 
}

In WPF code above, I want the button to be enabled only when Checked object is not null. I know one way is to have a bool property in C# code which tells me whether the Checked object is null or not, and then bind it to IsEnabled property. I want to know if there is a way I can bind IsEnabled to Checked object directly?



Solution 1:[1]

You can use a converter to convert an object into a bool. Look into IValueConverter.

public class IsNotNullToBoolConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("Two-way binding not supported by IsNotNullToBoolConverter");
    }
}

And your xaml would look like this:

<Window.Resources>
  <local:IsNotNullToBoolConverter x:Key="IsNotNull" />
</Window.Resources>

...

<Button IsEnabled="{Binding Converter={StaticResource IsNotNull}}" />

Solution 2:[2]

Use DataTrigger and check for {x:Null} value of binding:

<Button Content="TestButton">
    <Button.Style>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Checked}" Value="{x:Null}">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Also, you can use IValueConverter which will return false if value is null otherwise true.

public class ObjectToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                         CultureInfo culture)
    {
        bool returnValue = true;
        if (value == DependencyProperty.UnsetValue || value == null)
        {
            returnValue = false;
        }
        return returnValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

and bind in XAML:

<Button Content="TestButton"
        IsEnabled="{Binding Checked,
                    Converter={StaticResource ObjectToBoolConverter}}" />

Ofcourse you need to declare instance of converter in your XAML for this.

Solution 3:[3]

I know this is an old issue but you can do this without an extra code. Just add the "TargetNullValue=false" to the binding.

 IsEnabled="{Binding SomeProperty, TargetNullValue=false}"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 tataelm