ComboBox Data Binding to an Enum in WPF

There is a little trick when a ComboBox binds to an Enum in WPF. Here we collect 3 ways.

1: List all enum items in XAML file:

In .xaml:

<ComboBox x:Name=”cbUnit” SelectedIndex=”{Binding UnitType}”>
      <ComboBoxItem Content=”US”/>
      <ComboBoxItem Content=”Metric”/>
</ComboBox>

In ViewModel:

private int _UnitType;
public int UnitType
{
    get
    {
        return _UnitType;
    }
    set
    {
        if _UnitType!= value)
        {
            _UnitType= value;
            NotifyPropertyChanged(“UnitType”);
        }
    }
}

2: Use ItemSource and SelectedItem:

Enum:

public enum MyEnum01
{
    MyONE,
    MyTwo,
    MyThree
}

In XAML:

   <ComboBox Width=”133″ Height=”25″ ItemsSource=”{Binding MyList}” SelectedItem=”{Binding TestEnumItem}” />

In ViewModel:

private MyEnum01 _testEnumItem;
public MyEnum01 TestEnumItem
{
    get { return _testEnumItem; }
    set
    {
        if (value != _testEnumItem)
        {
            _testEnumItem = value;
            NotifyPropertyChanged(“TestEnumItem”);
        }
    }
}

public IEnumerable<MyEnum01> MyList
{
    get
    {
        return Enum.GetValues(typeof(MyEnum01)).Cast<MyEnum01>();
    }
}

3: Use KeyValuePair:

Consider to use KeyValuePair list to replace the IEnumerable above:

For example:

public ObservableCollection<KeyValuePair<int, string>> ListTags
{
    get
    {
        return GetTags();
    }
}

In GetTags you can get Key and Value pairs.

In XAML:

<ComboBox   Margin=”0″  Height=”23″ Cursor=”Hand”                                                     Width=”180″   Grid.Row=”3″    ItemsSource=”{Binding ListTags}”  DisplayMemberPath=”Value” SelectedValuePath=”Key”  SelectedValue=”{Binding Path=TagItem}”  >

In ViewModel

private int _tagItem;
public int TagItem
{
    get { return _tagItem; }
    set
    {
        _tagItem = value;
        NotifyPropertyChanged(“TagItem”);
    }
}