Oprócz odpowiedzi Adama Markowitza, tutaj jest ogólny sposób (względnie) po prostu ustawiania ItemSource
wartoś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 OnLoad
obsługi zdarzeń, trzeba ustawić źródło swojego pola kombi będzie wykaz ComboEnumItems
na podstawie każdy Enum
w swoim Enum
rodzaju. 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 enum
wartość, której można użyć w kodzie. Aby uzyskać dostęp do wyboru użytkownika w kodzie, comboBoxUserReadable.SelectedItem
będzie ComboEnumItem
i comboBoxUserReadable.SelectedValue
będzie EMyEnum
.