Sie müssen eine Aufzählung in eine ReadonlyCollection umwandeln und die Auflistung an die Combobox (oder ein beliebiges Steuerelement mit Schlüssel-Wert-Paar) binden.
Zunächst benötigen Sie eine Klasse, die die Elemente der Liste enthält. Da Sie lediglich das Int / String-Paar benötigen, empfehle ich die Verwendung einer Schnittstelle und einer Basisklassenkombination, damit Sie die Funktionalität in jedem gewünschten Objekt implementieren können:
public interface IValueDescritionItem
{
int Value { get; set;}
string Description { get; set;}
}
public class MyItem : IValueDescritionItem
{
HowNice _howNice;
string _description;
public MyItem()
{
}
public MyItem(HowNice howNice, string howNice_descr)
{
_howNice = howNice;
_description = howNice_descr;
}
public HowNice Niceness { get { return _howNice; } }
public String NicenessDescription { get { return _description; } }
#region IValueDescritionItem Members
int IValueDescritionItem.Value
{
get { return (int)_howNice; }
set { _howNice = (HowNice)value; }
}
string IValueDescritionItem.Description
{
get { return _description; }
set { _description = value; }
}
#endregion
}
Hier ist die Schnittstelle und eine Beispielklasse, die sie implementiert. Beachten Sie, dass der Schlüssel der Klasse stark in die Aufzählung eingegeben ist und dass die Eigenschaften von IValueDescritionItem explizit implementiert sind (sodass die Klasse alle Eigenschaften haben kann und Sie diejenigen auswählen können, die die implementieren Schlüssel / Wert-Paar.
Jetzt die EnumToReadOnlyCollection-Klasse:
public class EnumToReadOnlyCollection<T,TEnum> : ReadOnlyCollection<T> where T: IValueDescritionItem,new() where TEnum : struct
{
Type _type;
public EnumToReadOnlyCollection() : base(new List<T>())
{
_type = typeof(TEnum);
if (_type.IsEnum)
{
FieldInfo[] fields = _type.GetFields();
foreach (FieldInfo enum_item in fields)
{
if (!enum_item.IsSpecialName)
{
T item = new T();
item.Value = (int)enum_item.GetValue(null);
item.Description = ((ItemDescription)enum_item.GetCustomAttributes(false)[0]).Description;
//above line should be replaced with proper code that gets the description attribute
Items.Add(item);
}
}
}
else
throw new Exception("Only enum types are supported.");
}
public T this[TEnum key]
{
get
{
return Items[Convert.ToInt32(key)];
}
}
}
Alles, was Sie in Ihrem Code benötigen, ist:
private EnumToReadOnlyCollection<MyItem, HowNice> enumcol;
enumcol = new EnumToReadOnlyCollection<MyItem, HowNice>();
comboBox1.ValueMember = "Niceness";
comboBox1.DisplayMember = "NicenessDescription";
comboBox1.DataSource = enumcol;
Denken Sie daran, dass Ihre Sammlung mit MyItem eingegeben wurde, sodass der Combobox-Wert einen Aufzählungswert zurückgeben sollte, wenn Sie an die entsprechende Eigenschaft binden.
Ich habe die Eigenschaft T this [Enum t] hinzugefügt, um die Sammlung noch nützlicher zu machen als ein einfaches Combo-Verbrauchsmaterial, zum Beispiel textBox1.Text = enumcol [HowNice.ReallyNice] .NicenessDescription;
Sie können MyItem natürlich in eine Schlüssel- / Wertklasse umwandeln, die nur für diese Puprose verwendet wird, und MyItem in den Typargumenten von EnumToReadnlyCollection insgesamt effektiv überspringen, aber dann wären Sie gezwungen, den Schlüssel mit int zu verwenden (was bedeutet, combobox1.SelectedValue zu erhalten) würde int zurückgeben und nicht den Aufzählungstyp). Sie umgehen das, wenn Sie eine KeyValueItem-Klasse erstellen, um MyItem zu ersetzen, und so weiter und so fort ...