2011-03-02 2 views
2

基本的に、これを実行する最善の方法は何ですか?ドロップダウンリストからボックスへの方法

私はすべての可能な解像度を持つEnumを持っていて、それらをドロップダウンコンボボックスに表示します。

はこれまでのところ、私は私のようなコンボボックスに列挙型をバインドすることができた:

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 - Cool! – Wil

答えて

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; 
    } 
} 

もちろん、拡張メソッドを使用して説明を取得することを覚えておく必要があります。

+0

私はそのコードを見ていきます。 Parseについて - 私は暗黙のうちに "暗黙のうちにタイプ 'オブジェクト'を '解像度'に変換できません。明示的な変換が終了します(キャストがありませんか?私の深みから抜け出すのですか? – Wil

+0

「Enum.Parse」戻り値は 'object'型です。それをキャストする必要があります。 – Femaref

1

代わりにLookupEditを使用し、Enum ValueをKeyに、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への通話は、次のようになります。コンボボックスのDropDownStyleのDropDownListに設定されていると仮定すると

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

+0

「オブジェクト 'を暗黙のうちに変換できません。 '解決'。明示的な変換が終了します(あなたはキャストを紛失していますか?)...私の奥行きから抜け出すために必要なアイデアはありますか? – 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

はにバインドするために監視可能なコレクションを移入します。その後

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で:リストでは、実行時に変更されていない技術として、我々はListはどうしたらObservableCollectionは必要ありませんが、私はObservableCollectionは良い習慣だと思う

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

注意VMで作業するときに取り入れる。

関連する問題