Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display enum equalivent string values using MVVM

My goal is to databind strings that equalivent to my enum.

    public enum Language
    {
        Unknown=0,CSharp=1,VB=2,VisualCpp=3,FSharp=4
    }

    public enum ProjectType
    {
        Unknown=0,ConsoleApplication=1,ClassLibrary=2
    }

Here's my Model:

  class PLanguage
  {
    public Language EnumLanguage { get; set; }
    public string ImagePath { get; set; }
    public List<ProjectType> EnumTypes { get; set; }

  }

MyViewModel:

  class PLanguageViewModel : ViewModelBase
  {

    public PLanguage PLanguage { get; set; }
    private ObservableCollection<string> _typeCollection;
    public PLanguageViewModel(PLanguage pLanguage)
    {
        PLanguage = pLanguage;
    }
            public ObservableCollection<string> TypeCollection
    {
        get{} //CAST PLanguage.EnumTypes FROM ENUM TO STRING
    }
    public string ImagePath
    {
        get { return PLanguage.ImagePath; }
        set
        {
            if (PLanguage.ImagePath != value)
            {
                PLanguage.ImagePath = value;
                RaisePropertyChanged(() => ImagePath);
            }
        }
    }
    public static String ConvertToString(Enum eEnum)
    {
        return Enum.GetName(eEnum.GetType(), eEnum);
    }

  }

As you can see, I have a list of enum of type ProjectType. I want to convert these to an observable collection of strings that equalivent to the enum values, so I can databind them easily in my View. I need to create a Dependency Property of that collection, how can I do that?

like image 455
idish Avatar asked Dec 31 '12 16:12

idish


1 Answers

You can use Enum.GetNames to get all values and ObservableCollection constructor overload for data Binding.

public PLanguageViewModel(PLanguage pLanguage)
{
    PLanguage = pLanguage;
    _typeCollection = new ObservableCollection<string>(Enum.GetNames(typeof(ProjectType)));
   ...
}

You can use Enum.Parse to retrieve the ProjectType from observable collection.

EDIT as per comment Use following to bind String to SelectItem. Now You can use DataBinding over SelectedItem in the view. You can also achieve the same using IValueConverter

private ProjectType _selectedItem'

public string SelectedItem
{
   get
    {
      return ConvertEnumToString(_selectedItem);
    }
    set
    {
      _selectedItem = ConvertStringToEnum(value);
    }
}

public static string ConvertEnumToString(Enum eEnum)
{
    return Enum.GetName(eEnum.GetType(), eEnum);
}

public static ProjectType ConvertStringToEnum(string value)
{
    return (ProjectType)Enum.Parse(typeof(ProjectType), value);
}
like image 185
Tilak Avatar answered Sep 28 '22 03:09

Tilak