您需要将一个枚举转换为ReadonlyCollection并将该集合绑定到组合框(或与此相关的任何启用键值对的控件)
首先,您需要一个包含列表项的类。因为您只需要一个int / string对,所以我建议使用一个接口和一个基类组合,以便您可以在所需的任何对象中实现该功能:
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
}
这是接口和实现该接口的示例类。注意,该类的Key严格键入到Enum,并且IValueDescritionItem属性是显式实现的(因此该类可以具有任何属性,您可以选择实现该属性的属性)键/值对。
现在,EnumToReadOnlyCollection类:
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)];
}
}
}
因此,您所需的代码是:
private EnumToReadOnlyCollection<MyItem, HowNice> enumcol;
enumcol = new EnumToReadOnlyCollection<MyItem, HowNice>();
comboBox1.ValueMember = "Niceness";
comboBox1.DisplayMember = "NicenessDescription";
comboBox1.DataSource = enumcol;
请记住,您的集合使用MyItem输入,因此如果您绑定到适当的属性,则组合框值应返回一个枚举值。
我添加了T this [Enum t]属性,以使该集合比简单的组合式消耗品更加有用,例如,textBox1.Text = enumcol [HowNice.ReallyNice] .NicenessDescription;。
当然,您可以选择将MyItem变成仅用于此对象的Key / Value类,从而有效地完全跳过了EnumToReadnlyCollection的类型参数中的MyItem,但是随后您将不得不使用int作为键(这意味着获取combobox1.SelectedValue将返回int而不是enum类型)。如果创建KeyValueItem类来替换MyItem等,则可以解决此问题。