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