Перечисление для раскрывающегося списка метода - PullRequest
2 голосов
/ 02 марта 2011

Как лучше всего это сделать?

У меня есть Enum со всеми возможными разрешениями, и я хочу, чтобы они отображались в выпадающем списке.

Пока я обнаружил, что могу связать перечисление со списком, например:

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

Однако в методе у меня есть:

public void testmethod(Resolution res){}

и я не могу придумать, как конвертировать обратно. Я думал об изменении метода для использования строки, но тогда мне придется сделать case или if s в методе для преобразования обратно в перечисление.

Кроме того, в идеале я хочу, чтобы у некоторых имен были пробелы. Я читал о [Description("Description with spaces")], но я думаю, что это применяется только к ToString.

Даже если бы я должен был сделать какой-то цикл и добавить каждый элемент в блок через ToString, он все равно вернет строку.

Я не совсем уверен, как поступить иначе, чем свалить Enum все вместе и просто пойти другим путем.

Мне просто интересно в подобной ситуации, что бы вы сделали?

Ответы [ 6 ]

1 голос
/ 02 марта 2011

Я бы пошел с какой-то картой - каждое значение перечисления будет иметь свое собственное строковое описание.

Код для этого может быть:

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));
   ...
}
1 голос
/ 02 марта 2011

Разве вы не можете просто сделать Enum.Parse(typeof(Resolution), comboBox2.SelectedText)?

Таким образом, ваш вызов testmethod будет выглядеть так:

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

Предполагая, что поле со списком DropDownStyle установлен в DropDownList .

1 голос
/ 02 марта 2011

Я бы вместо этого использовал LookupEdit и привязал бы значение Enum к ключу, а Enum.GetNames(typeof(Resolutions)); - к отображаемому значению при редактировании. Затем, когда пользователь выбирает элемент, вы получаете фактическое значение вместо имени.

0 голосов
/ 31 июля 2012

Заполните наблюдаемую коллекцию для привязки.

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 a List, но я думаю, что ObservableCollection - это хорошая привычка при работе с виртуальными машинами.

0 голосов
/ 02 марта 2011

Вы можете использовать Enum.TryParse<TEnum>:

Resolution res;
if (Enum.TryParse<Resolution>(input, out res))
{
    // use res
}
else
{
   // input was not a valid Resolution value
}
0 голосов
/ 02 марта 2011

Вы можете использовать метод 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;
    }
}

Конечно, вам нужно помнить, чтобы использовать метод расширения, чтобы получить описание - однако его преобразование - это нечто иное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...