枚举下拉框方法

时间:2011-03-02 14:29:07

标签: c# syntax enums combobox

基本上,这样做的最佳方式是什么?

我有一个具有所有可能分辨率的枚举,我希望它们显示在下拉组合框中。

到目前为止,我发现我可以将枚举绑定到组合框,如:

comboBox2.DataSource = Enum.GetNames(typeof(Resolution));

然而,在一种方法中,我有:

public void testmethod(Resolution res){}

我无法想到一种转换方式。我正在考虑更改方法以使用字符串,但是我必须在方法中执行caseif来转换回枚举。

另外,我理想地希望一些名称有空格。我已经阅读了[Description("Description with spaces")],但我认为这只适用于ToString。

即使我要做某种循环并通过ToString将每个项目添加到框中,它仍然会返回一个字符串。

我不确定如何继续将Enum全部放在一起,只是采取不同的方法。

我只是想在类似的情况下,你会做什么?

6 个答案:

答案 0 :(得分:1)

我会改为使用LookupEdit,并将枚举值与键绑定,并将Enum.GetNames(typeof(Resolutions));与编辑时显示的值绑定。然后,当用户选择一个项目时,您将获得实际值而不是名称。

答案 1 :(得分:1)

你不能只做Enum.Parse(typeof(Resolution), comboBox2.SelectedText)吗?

因此,您对testmethod的调用如下:

testmethod((Resolution)Enum.Parse(typeof(Resolution), comboBox2.SelectedText));

假设组合框的DropDownStyle设置为 DropDownList

答案 2 :(得分:1)

我会选择某种地图 - 每个枚举值都有自己的字符串描述。

此代码可以是:

public enum Resolution
{
   High,
   Medium,
   Low
}

Dictionary<Resolution, string> Descriptions = new Dictionary<Resolution, string>();
Descriptions.Add(Resolution.High, "1920x1080");
Descriptions.Add(Resolution.Medium, "1280x720");
Descriptions.Add(Resolution.Low, "800x600");

comboBox2.DataSource = Descriptions.Values;

public void testmethod(Resolution res)
{
   string description = Descriptions[res];
   ...
}

public void testmethod2(string description)
{
   Resolution res = Descriptions.Keys.ToList().Find(k => Descriptions[k].Equals(description));
   ...
}

答案 3 :(得分:0)

您可以使用Enum.Parse(Type t, string s)方法从字符串中获取枚举,在您的情况下,它将是:

Resolution r = (Resolution)Enum.Parse(typeof(Resolution), input);

关于您的描述想法,我在我的代码中使用以下内容:

public static class EnumExtender
{
    public static string StringValue(this Enum value)
    {
        FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
        EnumStringValueAttribute[] attributes = (EnumStringValueAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumStringValueAttribute), false);


        if (attributes.Length > 0)
        {
            return attributes[0].Value;
        }


        return value.ToString();
    } 
}

public class EnumStringValueAttribute : Attribute
{
    public string Value { get; set; }


    public EnumStringValueAttribute(string value) : base()
    {
        this.Value = value;
    }
}

当然,您必须记住使用扩展方法来获取描述 - 然后将其转换回来是不同的。

答案 4 :(得分:0)

您可以使用Enum.TryParse<TEnum>

Resolution res;
if (Enum.TryParse<Resolution>(input, out res))
{
    // use res
}
else
{
   // input was not a valid Resolution value
}

答案 5 :(得分:0)

填充Observable Collection以绑定到。

public class MyVM : BindableObject //where BindableObject is a base object that supports INotifyPropertyChanged and provides a RaisePropertyChanged method
{
    private readonly ObservableCollection<MyEnum> _myEnums;
    private MyEnum _selectedEnum;

    public MyVM()
    {
       //create and populate collection
       _myEnums = new ObservableCollection<MyEnum>();
       foreach (MyEnum myEnum in Enum.GetValues(typeof(MyEnum)))
       {
         _myEnums.Add(myEnum);
       }
     }

     //list property to bind to
     public IEnumerable<MyEnum> MyEnumValues
     {
         get { return _myEnums; }
     }

     //a property to bind the selected item to
     public MyEnum SelectedEnum
     {
         get { return __selectedEnum; }
         set
         {
            if (!Equals(__selectedEnum, value))
            {
              __selectedEnum = value;
              RaisePropertyChanged("SelectedEnum");
            }
         }
     }
}

然后在xaml中绑定:

<ComboBox ItemsSource="{Binding Path=MyEnumValues}"
          SelectedItem="{Binding Path=SelectedEnum}"/>

请注意,从技术上讲,由于列表在运行时没有变化,我们不需要ObservableCollection List会这样做,但我认为ObservableCollection是工作时养成的好习惯与虚拟机。