Search code examples
c#wpfxamlenumsradcombobox

Populate RadComboBox from enum list in WPF MVVM


I found some topics "How to bind a combobox from enum list", but my problem is that I try to use MVVM arhitecture and let my View (xaml) clear as you see below:

part of View (xaml.cs):

public partial class GreenCertificatesStockForm : Erp.Core.Wpf.BaseWindow
    {
        private Models.GreenCertificatesGroupModel model;
        public GreenCertificatesStockForm()
        {
            model = new Models.GreenCertificatesGroupModel();

            this.DataContext = model;

            InitializeComponent();

            model.LoadForm(); // propose some dates for my form
            model.RequestClose += () => { Close(); };
        }
    }

part of View (xaml) my RadComboBox:

<telerik:RadComboBox Name="certificatesTypeRadComboBox"
                      Margin="5 2 0 2"  Width="150"
                      SelectedValue="{Binding CertificatesTypeEnum , Mode=TwoWay, 
                                                ValidatesOnDataErrors=True, 
                                                ValidatesOnExceptions=True, 
                                                NotifyOnValidationError=True}"
                      ItemSource="{Binding }"
                      SelectedItem="{Binding }"
                      telerik:StyleManager.Theme="Office_Blue" BorderBrush="#FF707070" Background="#FFDDDDDD" 
                                >

            </telerik:RadComboBox>

So, my Enum list is created in my ViewModel (class.cs) as:

public enum CertificatesTypeEnum {
            Estimat = 1,
            Calculat = 2,
            Facturat = 3
            }

I need to display in my RadComboBox all Values of the Enum and by selectedValue to save the specific Key of selection in DB (this with a parameter). How can I display the values from ViewModel into ComboBox (View)?

I know can do something like :

var items = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>().Select(i => new ComboboxItem()
        { Text = Enum.GetName(typeof(gender), i), Value = (int)i}).ToArray<ComboboxItem>();
        //Add the items to your combobox (given that it's called comboBox1)
        RadComboBoxName.Items.AddRange(items);

but this must be made in xaml.cs file (and I don't want this solution), because in ViewModel the combobox are not recognised and will be not found.

In short : display Values of Enum list from ViewModel class in xaml file.


Solution

  • Why don't you just call the Enum.GetValues method in the view model? This is MVVM:

    public class GreenCertificatesGroupModel
    {
        public IEnumerable<CertificatesTypeEnum> EnumValues
        {
            get
            {
                var list = Enum.GetValues(typeof(CertificatesTypeEnum)).Cast<CertificatesTypeEnum>();
                return list;
            }
    
        }
    
        private CertificatesTypeEnum _selectedItem;
    
        public CertificatesTypeEnum SelectedItem
        {
            get { return _selectedItem; }
            set { _selectedItem = value; }
        }
    }
    

    XAML:

    <telerik:RadComboBox ItemsSource="{Binding EnumValues}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />