Neben der Antwort von Adam Markowitz gibt es hier eine allgemeine Möglichkeit, die ItemSource
Werte einer Combobox (relativ) einfach festzulegen enums
, während dem Benutzer das Attribut 'Description' angezeigt wird. (Man könnte meinen, jeder würde dies tun wollen, damit es sich um einen .NET- Einzeiler handelt, aber das ist es einfach nicht, und dies ist der eleganteste Weg, den ich gefunden habe).
Erstellen Sie zunächst diese einfache Klasse, um einen beliebigen Enum-Wert in ein ComboBox-Element zu konvertieren:
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;
}
}
Zweitens müssen Sie in Ihrem OnLoad
Ereignishandler festlegen, dass die Quelle Ihres Kombinationsfelds eine Liste ist, ComboEnumItems
die auf jedem Enum
in Ihrem Enum
Typ basiert . Dies kann mit Linq erreicht werden. Dann stellen Sie einfach Folgendes ein 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";
}
Jetzt wählt der Benutzer aus einer Liste Ihrer Benutzerfreundlichen aus Descriptions
, aber was er auswählt, ist der enum
Wert, den Sie im Code verwenden können. Um auf die Auswahl des Benutzers im Code zuzugreifen, comboBoxUserReadable.SelectedItem
wird das ComboEnumItem
und comboBoxUserReadable.SelectedValue
das sein EMyEnum
.