В дополнение к ответу Адама Марковица, здесь представлен универсальный способ (относительно) простого задания 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.