5

私の目標は、列挙型と同等の文字列をデータバインドすることです。

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

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

これが私のモデルです:

  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);
    }

  }

ご覧のとおり、ProjectType型の列挙型のリストがあります。これらを列挙値と等しい文字列の監視可能なコレクションに変換して、ビューで簡単にデータバインドできるようにします。そのコレクションの依存関係プロパティを作成する必要がありますが、どうすればよいですか?

4

1 に答える 1

11

Enum.GetNamesを使用して、データバインディングのすべての値とObservableCollectionコンストラクターのオーバーロードを取得できます。

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

Enum.Parseを使用して、監視ProjectType可能なコレクションから を取得できます。

コメントに従って編集SelectItem文字列をにバインドするには、以下を使用します。SelectedItemこれで、ビューでDataBindingを使用できます。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);
}
于 2012-12-31T16:56:47.543 に答える