Oprócz odpowiedzi Adama Markowitza, tutaj jest ogólny sposób (względnie) po prostu ustawiania ItemSourcewartości comboboxa enums, przy jednoczesnym pokazywaniu użytkownikowi atrybutu „Opis”. (Można by pomyśleć, że każdy chciałby to zrobić, aby był to .NET jeden liner, ale tak po prostu nie jest i jest to najbardziej elegancki sposób, jaki znalazłem).
Najpierw utwórz tę prostą klasę do konwersji dowolnej wartości Enum na element 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;
}
}
Po drugie w swojej OnLoadobsługi zdarzeń, trzeba ustawić źródło swojego pola kombi będzie wykaz ComboEnumItemsna podstawie każdy Enumw swoim Enumrodzaju. Można to osiągnąć za pomocą Linq. Następnie ustaw 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";
}
Teraz użytkownik wybierze z listy przyjaznych dla użytkownika Descriptions, ale wybierze enumwartość, której można użyć w kodzie. Aby uzyskać dostęp do wyboru użytkownika w kodzie, comboBoxUserReadable.SelectedItembędzie ComboEnumItemi comboBoxUserReadable.SelectedValuebędzie EMyEnum.