Oltre alla risposta di Adam Markowitz, ecco un modo generico di (relativamente) semplicemente impostare i ItemSource
valori di una casella combinata da enums
mostrare, 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 OnLoad
gestore dell'evento, devi impostare l'origine della casella combinata in modo che sia un elenco di ComboEnumItems
tutti i tipi Enum
nel tuo Enum
tipo. 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 enum
valore che puoi usare nel codice. Per accedere alla selezione dell'utente nel codice, comboBoxUserReadable.SelectedItem
sarà il ComboEnumItem
e comboBoxUserReadable.SelectedValue
sarà il EMyEnum
.