WPF Associazione di un ListBox a un enum, visualizzando l’Attributo Description

È ansible utilizzare il metodo ObjectDataProvider per associare un ListBox a un enum e formattarlo in qualche modo per visualizzare l’Attriibute di descrizione? Se sì, come si fa a fare questo …?

Sì, è ansible. Questo lo farà. Diciamo che abbiamo l’enum

public enum MyEnum { [Description("MyEnum1 Description")] MyEnum1, [Description("MyEnum2 Description")] MyEnum2, [Description("MyEnum3 Description")] MyEnum3 } 

Quindi possiamo usare ObjectDataProvider come

 xmlns:MyEnumerations="clr-namespace:MyEnumerations" 
      

E per il ListBox impostiamo ItemsSource su MyEnumValues ​​e applichiamo un ItemTemplate con un convertitore.

        

E nel convertitore otteniamo la descrizione e la restituiamo

 public class EnumDescriptionConverter : IValueConverter { private string GetEnumDescription(Enum enumObj) { FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); object[] attribArray = fieldInfo.GetCustomAttributes(false); if (attribArray.Length == 0) { return enumObj.ToString(); } else { DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute; return attrib.Description; } } object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) { Enum myEnum = (Enum)value; string description = GetEnumDescription(myEnum); return description; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return string.Empty; } } 

Il metodo GetEnumDescription dovrebbe probabilmente andare da qualche altra parte ma si ottiene l’idea 🙂

Se ti leghi all’Enum, potresti probabilmente convertirlo nella descrizione attraverso un IValueConverter.

Vedi Binding ComboBoxes to enums … in Silverlight! per una descrizione su come realizzare questo.

Vedere http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx per ulteriori informazioni.

È ansible definire un file di risorsa nel progetto (file * .resx). In questo file devi definire “coppie chiave-valore”, qualcosa del genere:

 "YellowCars" : "Yellow Cars", "RedCars" : "Red Cars", 

e così via…

Le chiavi sono uguali alle tue enum-entry, qualcosa del genere:

 public enum CarColors { YellowCars, RedCars } 

e così via…

Quando usi WPF puoi implementare nel tuo codice XAML qualcosa del genere:

        

Quindi devi scrivere il tuo convertitore, qualcosa del genere:

 using System; using System.Globalization; using System.Resources; using System.Windows.Data; public class CarColorConverter : IValueConverter { private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors)); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var key = ((Enum)value).ToString(); var result = CarColors.GetString(key); if (result == null) { result = key; } return result; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

La mia risposta arriva a 7 anni di ritardo 😉 Ma forse può essere usato da qualcun altro!