Oltre alla risposta di Adam Markowitz, ecco un modo generico di (relativamente) semplicemente impostare i ItemSourcevalori di una casella combinata da enumsmostrare, mostrando allo stesso tempo l'attributo 'Descrizione'. (Penseresti che tutti vorrebbero farlo in modo che sarebbe un liner .NET , ma non lo è, e questo è il modo più elegante che ho trovato).
Innanzitutto, crea questa semplice classe per convertire qualsiasi valore Enum in un elemento 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;
}
}
In secondo luogo, nel OnLoadgestore dell'evento, devi impostare l'origine della casella combinata in modo che sia un elenco di ComboEnumItemstutti i tipi Enumnel tuo Enumtipo. Ciò può essere ottenuto con Linq. Quindi imposta semplicemente 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";
}
Ora l'utente selezionerà da un elenco di user friendly Descriptions, ma ciò che selezioneranno sarà il enumvalore che puoi usare nel codice. Per accedere alla selezione dell'utente nel codice, comboBoxUserReadable.SelectedItemsarà il ComboEnumIteme comboBoxUserReadable.SelectedValuesarà il EMyEnum.