Suite à la réponse d'Adam Markowitz, voici une manière générale de définir (relativement) simplement les ItemSource
valeurs d'une zone de liste déroulante enums
, tout en montrant l'attribut «Description» à l'utilisateur. (On pourrait penser que tout le monde voudrait le faire pour que ce soit un .NET liner one , mais ce n'est tout simplement pas le cas, et c'est la manière la plus élégante que j'ai trouvée).
Tout d'abord, créez cette classe simple pour convertir n'importe quelle valeur Enum en 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;
}
}
Deuxièmement, dans votre OnLoad
gestionnaire d'événements, vous devez définir la source de votre zone de liste déroulante pour être une liste ComboEnumItems
basée sur chaque élément Enum
de votre Enum
type. Cela peut être réalisé avec Linq. Ensuite, définissez simplement 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 sélectionnera dans une liste de vos utilisateurs Descriptions
, mais ce qu'il sélectionnera sera la enum
valeur que vous pouvez utiliser dans le code. Pour accéder à la sélection de l'utilisateur en code, comboBoxUserReadable.SelectedItem
sera le ComboEnumItem
et comboBoxUserReadable.SelectedValue
sera le EMyEnum
.