Suite à la réponse d'Adam Markowitz, voici un moyen objectif général de (relativement) définissant simplement les ItemSource
valeurs d'un combobox être enums
, tout en montrant l'attribut 'Description' à l'utilisateur.(On pourrait penser que tout le monde voudrait faire cela pour que ce soit un paquebot, mais ce n'est pas le cas, et c'est la façon la plus élégante que j'ai trouvée).
Tout d'abord, créez cette classe simple pour convertir une valeur Enum dans un élément 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;
}
}
En second lieu dans votre gestionnaire d'événements OnLoad
, vous devez définir la source de votre zone de liste déroulante à une liste de ComboEnumItems
basé sur tous les Enum
dans votre type Enum
. Cela peut être réalisé avec Linq. Ensuite, il suffit régler la 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";
}
Maintenant, l'utilisateur choisira parmi une liste de votre facile à utiliser Descriptions
, mais ce qu'ils choisissent sera la valeur enum
que vous pouvez utiliser dans le code. Pour accéder à la sélection de l'utilisateur dans le code, comboBoxUserReadable.SelectedItem
sera le ComboEnumItem
et comboBoxUserReadable.SelectedValue
sera le EMyEnum
.
Je sais que c'est vieux, mais pour les nouveaux lecteurs, la meilleure réponse est de @MertCingoz ci-dessous. Pas de classe spéciale à gérer et pas besoin de surcharger la méthode ToString(). – dshrout