Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to bind a boolean to combobox in wpf

Tags:

binding

wpf

Well I was wondering how to bind a boolean property to a combobox.Combobox will be a yes/no combobox.

like image 392
user434547 Avatar asked Dec 02 '10 13:12

user434547


4 Answers

You could use a ValueConverter to convert the boolean value to a ComboBox index and back. Like this:

public class BoolToIndexConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((bool)value == true) ? 0 : 1;   
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int)value == 0) ? true : false;
        }
    }
}

Assuming Yes is on index 0 and No on index 1. Then you'd have to use that converter in binding to the SelectedIndex property. For this, you declare your converter in your resources section:

  <Window.Resources>
    <local:BoolToIndexConverter x:Key="boolToIndexConverter" />
  </Window.Resources>

Then you use it in your binding:

<ComboBox SelectedIndex="{Binding YourBooleanProperty, Converter={StaticResource boolToIndexConverter}}"/>
like image 71
Botz3000 Avatar answered Nov 17 '22 05:11

Botz3000


I have found myself using the IsSelected property of the ComboBox items for this in the past. This method is entirely in xaml.

<ComboBox>
    <ComboBoxItem Content="No" />
    <ComboBoxItem Content="Yes" IsSelected="{Binding YourBooleanProperty, Mode=OneWayToSource}" />
</ComboBox>
like image 45
Derrick Moeller Avatar answered Nov 17 '22 06:11

Derrick Moeller


First solution is to replace your 'Yes/No' combobox with a checkbox because, well, checkbox exists for a reason.

Second solution is to fill your combobox with true and false objects and then bind the 'SelectedItem' of your combobox to your Boolean property.

like image 11
Nicolas Repiquet Avatar answered Nov 17 '22 07:11

Nicolas Repiquet


Here is an example (replace enabled/disabled with yes/no):

<ComboBox SelectedValue="{Binding IsEnabled}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={x:Static converters:EnabledDisabledToBooleanConverter.Instance}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBox.Items>
        <system:Boolean>True</system:Boolean>
        <system:Boolean>False</system:Boolean>
    </ComboBox.Items>
</ComboBox>

Here is Converter:

public class EnabledDisabledToBooleanConverter : IValueConverter
{
    private const string EnabledText = "Enabled";
    private const string DisabledText = "Disabled";
    public static readonly EnabledDisabledToBooleanConverter Instance = new EnabledDisabledToBooleanConverter();

    private EnabledDisabledToBooleanConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Equals(true, value)
            ? EnabledText
            : DisabledText;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Actually won't be used, but in case you need that
        return Equals(value, EnabledText);
    }
}

And no need to play with indices.

like image 3
Artiom Avatar answered Nov 17 '22 05:11

Artiom