views:

72

answers:

2

I'm a starter in WPF, and there's something I can't seem to figure out.

I have a checkbox that I would like to disable when a radio button is not selected. my current syntax is:

<CheckBox IsEnabled="{Binding ElementName=rbBoth, Path=IsChecked}">Show all</CheckBox>

So basically, I want IsEnabled to take the opposite value than the binding expression I'm currently supplying.

How can I do this? Thanks

+3  A: 

You need to use what's called a value converter (a class that implements IValueConverter.) A very basic example of such a class is shown below. (Watch for clipping...)

public class NegateConverter : IValueConverter
{

    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        if ( value is bool ) {
            return !(bool)value;
        }
        return value;
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        if ( value is bool ) {
            return !(bool)value;
        }
        return value;
    }

}

Then to include it in your XAML you would do something like:

<UserControl xmlns:local="clr-namespace:MyNamespace">
    <UserControl.Resources>
        <local:NegateConverter x:Key="negate" />
    </UserControl.Resources>

    ...
    <CheckBox IsEnabled="{Binding IsChecked, ElementName=rbBoth, Converter={StaticResource negate}}"
              Content="Show all" />

</UserControl>
Josh Einstein
Yeah... I thought about that, but I was trying to see if there's a more direct approach.
SiN
As you use WPF more and more you'll find that you create a pretty sophisticated set of converters and the design of them is typically very reusable. In fact, I do have a NegateConverter but it's much more robust than my example. It negates numerics, booleans, Visibility, Thickness, etc. Just one of about a dozen converters I use frequently.
Josh Einstein
Josh: How do you negate a Thickness?
Gabe
var thickness2 = new Thickness(-t1.Left, -t1.Top, -t1.Right, -t1.Bottom);
Josh Einstein
Here actually I just blogged about it... http://josheinstein.com/blog/index.php/2010/06/a-multi-purpose-negateconverter-for-wpfsilverlight/
Josh Einstein
Add some sugar... `return ( value is bool ) ? !(bool)value : value;`
Veer
Josh: I guess I'm having trouble figuring out what circumstances would ever call for negating a Thickness.
Gabe
You need to (pun intended) "think outside the box". For example, inside a template if I wanted an element to have a negative margin equal to the border thickness of the templated parent. Or to "cancel out" the padding of a containing element.
Josh Einstein
+1  A: 

Your current syntax already serves your need. It will disable the checkbox if the radiobutton is not checked.

If you really want to invert the scenario, all you need is a Converter. Take a look at this sample.

Veer