基本上,这样做的最佳方式是什么?
我有一个具有所有可能分辨率的枚举,我希望它们显示在下拉组合框中。
到目前为止,我发现我可以将枚举绑定到组合框,如:
comboBox2.DataSource = Enum.GetNames(typeof(Resolution));
然而,在一种方法中,我有:
public void testmethod(Resolution res){}
我无法想到一种转换方式。我正在考虑更改方法以使用字符串,但是我必须在方法中执行case
或if
来转换回枚举。
另外,我理想地希望一些名称有空格。我已经阅读了[Description("Description with spaces")]
,但我认为这只适用于ToString。
即使我要做某种循环并通过ToString将每个项目添加到框中,它仍然会返回一个字符串。
我不确定如何继续将Enum全部放在一起,只是采取不同的方法。
我只是想在类似的情况下,你会做什么?
答案 0 :(得分:1)
我会改为使用LookupEdit
,并将枚举值与键绑定,并将Enum.GetNames(typeof(Resolutions));
与编辑时显示的值绑定。然后,当用户选择一个项目时,您将获得实际值而不是名称。
答案 1 :(得分:1)
你不能只做Enum.Parse(typeof(Resolution), comboBox2.SelectedText)
吗?
因此,您对testmethod
的调用如下:
testmethod((Resolution)Enum.Parse(typeof(Resolution), comboBox2.SelectedText));
假设组合框的DropDownStyle
设置为 DropDownList 。
答案 2 :(得分:1)
我会选择某种地图 - 每个枚举值都有自己的字符串描述。
此代码可以是:
public enum Resolution
{
High,
Medium,
Low
}
Dictionary<Resolution, string> Descriptions = new Dictionary<Resolution, string>();
Descriptions.Add(Resolution.High, "1920x1080");
Descriptions.Add(Resolution.Medium, "1280x720");
Descriptions.Add(Resolution.Low, "800x600");
comboBox2.DataSource = Descriptions.Values;
public void testmethod(Resolution res)
{
string description = Descriptions[res];
...
}
public void testmethod2(string description)
{
Resolution res = Descriptions.Keys.ToList().Find(k => Descriptions[k].Equals(description));
...
}
答案 3 :(得分:0)
您可以使用Enum.Parse(Type t, string s)
方法从字符串中获取枚举,在您的情况下,它将是:
Resolution r = (Resolution)Enum.Parse(typeof(Resolution), input);
关于您的描述想法,我在我的代码中使用以下内容:
public static class EnumExtender
{
public static string StringValue(this Enum value)
{
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
EnumStringValueAttribute[] attributes = (EnumStringValueAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumStringValueAttribute), false);
if (attributes.Length > 0)
{
return attributes[0].Value;
}
return value.ToString();
}
}
public class EnumStringValueAttribute : Attribute
{
public string Value { get; set; }
public EnumStringValueAttribute(string value) : base()
{
this.Value = value;
}
}
当然,您必须记住使用扩展方法来获取描述 - 然后将其转换回来是不同的。
答案 4 :(得分:0)
您可以使用Enum.TryParse<TEnum>
:
Resolution res;
if (Enum.TryParse<Resolution>(input, out res))
{
// use res
}
else
{
// input was not a valid Resolution value
}
答案 5 :(得分:0)
填充Observable Collection以绑定到。
public class MyVM : BindableObject //where BindableObject is a base object that supports INotifyPropertyChanged and provides a RaisePropertyChanged method
{
private readonly ObservableCollection<MyEnum> _myEnums;
private MyEnum _selectedEnum;
public MyVM()
{
//create and populate collection
_myEnums = new ObservableCollection<MyEnum>();
foreach (MyEnum myEnum in Enum.GetValues(typeof(MyEnum)))
{
_myEnums.Add(myEnum);
}
}
//list property to bind to
public IEnumerable<MyEnum> MyEnumValues
{
get { return _myEnums; }
}
//a property to bind the selected item to
public MyEnum SelectedEnum
{
get { return __selectedEnum; }
set
{
if (!Equals(__selectedEnum, value))
{
__selectedEnum = value;
RaisePropertyChanged("SelectedEnum");
}
}
}
}
然后在xaml中绑定:
<ComboBox ItemsSource="{Binding Path=MyEnumValues}"
SelectedItem="{Binding Path=SelectedEnum}"/>
请注意,从技术上讲,由于列表在运行时没有变化,我们不需要ObservableCollection
List
会这样做,但我认为ObservableCollection
是工作时养成的好习惯与虚拟机。