2011-03-02 6 views
2

기본적으로이 작업을 수행하는 가장 좋은 방법은 무엇입니까?열거 형 상자에서 메서드

가능한 모든 해상도를 가진 열거 형을 가지고 있으며 드롭 다운 콤보 상자에 표시하려고합니다.

지금까지, 나는 내가 좋아하는 콤보 상자에 열거를 바인딩 할 수 발견 :

public void testmethod(Resolution res){} 

와 나는 생각할 수 없다 : 방법에

comboBox2.DataSource = Enum.GetNames(typeof(Resolution)); 

그러나, 나는이 다시 변환하는 방법. 문자열을 사용하는 메서드를 변경하려고 생각했지만 그 다음 열거 형으로 다시 변환하는 메서드에서 case 또는 if을 수행해야합니다.

또한 일부 이름에 공백이 있어야합니다. 내가 [Description("Description with spaces")]에 대해 읽었지만, 이것은 ToString에만 적용되는 것으로 생각합니다.

루프를 수행하고 각 항목을 ToString을 통해 상자에 추가하더라도 여전히 문자열을 반환합니다.

나는 Enum을 모두 모아서 다른 방법으로 진행하는 것 이외의 다른 방법을 잘 모른다.

나는 비슷한 상황에서 궁금한 점이 있었습니까?

+0

[스택 운동 선수] (http://stackathlon.appspot.com/)의 계급에 오신 것을 환영합니다. –

+0

@Dennis Williamson - 멋지다! – Wil

답변

0

당신은 문자열에서 열거를 얻기 위해 Enum.Parse(Type t, string s) 방법을 사용할 수 있습니다, 귀하의 경우에는 다음과 같습니다

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; 
    } 
} 
:
Resolution r = (Resolution)Enum.Parse(typeof(Resolution), input); 

는 설명 아이디어에 관하여, 나는 내 코드에서 다음 사용

물론, 확장 메소드를 사용하여 설명을 얻는 것을 잊지 말아야합니다.

+0

그 코드를 살펴 보겠습니다. 구문 분석에 관해서는 - "암시 적으로 '개체'를 '해상도'로 변환 할 수 없음을 나타내는 빨간색 밑줄이 계속 나타납니다. 명시 적 변환이 종료됩니다 (캐스트를 놓치고 있습니까?). – Wil

+0

"Enum.Parse"반환 값의 타입이'object'이고, 여러분은 그것을 던져야 만합니다. – Femaref

1

대신 LookupEdit을 사용하고 키에 열거 형 값을 연결하고 편집시 표시된 값에 Enum.GetNames(typeof(Resolutions));을 연결합니다. 그런 다음 사용자가 항목을 선택하면 이름 대신 실제 값을 얻습니다.

0

당신은 Enum.TryParse<TEnum> 사용할 수 있습니다

Resolution res; 
if (Enum.TryParse<Resolution>(input, out res)) 
{ 
    // use res 
} 
else 
{ 
    // input was not a valid Resolution value 
} 
1

당신이 단지 Enum.Parse(typeof(Resolution), comboBox2.SelectedText)을 할 수 있습니까?

testmethod((Resolution)Enum.Parse(typeof(Resolution), comboBox2.SelectedText)); 


가 있다고 가정하면 콤보 상자의 DropDownStyleDropDownList로으로 설정됩니다

그래서 testmethod에 전화처럼 보일 것이다.

+0

" 'object'타입을 암시 적으로 변환 할 수 없다는 빨간색 밑줄이 계속 나타납니다. '해결'. 노골적인 전환이 종료됩니다 (캐스트가 누락 되었습니까?) ... 내 깊이에서 벗어나기 시작할 때 필요한 아이디어가 있습니까? – Wil

+0

Argg .. 죄송합니다, 저의 실수입니다. Enum.Parse가 반환 한 값은 형식 변환되어야합니다. 그것은 .NET 기묘 ... 내 게시물을 즉시 해결할 것입니다. – code4life

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)); 
    ... 
} 
0

가 결합 할 수있는 관찰 가능한 컬렉션을 채 웁니다. ListObservableCollection 할 것리스트가 런타임에 변경되지 않는 기술적으로, 우리가 필요로하지 않는

<ComboBox ItemsSource="{Binding Path=MyEnumValues}" 
      SelectedItem="{Binding Path=SelectedEnum}"/> 

참고,하지만 난 ObservableCollection 좋은 습관이라고 생각 :

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에서 바인딩 VM 작업을 할 때