В дополнение к ответу Адама Марковица, здесь представлен универсальный способ (относительно) простого задания ItemSource
значений поля со списком enums
, при этом показывая атрибут «Описание» пользователю. (Вы можете подумать, что все захотят сделать это так, чтобы это был .NET- лайнер, но это не так, и это самый элегантный способ, который я нашел).
Сначала создайте этот простой класс для преобразования любого значения Enum в элемент ComboBox:
public class ComboEnumItem {
public string Text { get; set; }
public object Value { get; set; }
public ComboEnumItem(Enum originalEnum)
{
this.Value = originalEnum;
this.Text = this.ToString();
}
public string ToString()
{
FieldInfo field = Value.GetType().GetField(Value.ToString());
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
return attribute == null ? Value.ToString() : attribute.Description;
}
}
Во-вторых, в вашем OnLoad
обработчике событий вы должны установить источник вашего поля со списком, чтобы быть списком, ComboEnumItems
основанным на каждом Enum
в вашем Enum
типе. Это может быть достигнуто с Linq. Затем просто установите DisplayMemberPath
:
void OnLoad(object sender, RoutedEventArgs e)
{
comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
.Cast<EMyEnum>()
.Select(v => new ComboEnumItem(v))
.ToList();
comboBoxUserReadable.DisplayMemberPath = "Text";
comboBoxUserReadable.SelectedValuePath= "Value";
}
Теперь пользователь будет выбирать из списка ваших удобных для пользователя Descriptions
, но то, что они выберут, будет enum
значением, которое вы можете использовать в коде. Чтобы получить доступ к выбору пользователя в коде, comboBoxUserReadable.SelectedItem
будет ComboEnumItem
и comboBoxUserReadable.SelectedValue
будет EMyEnum
.