2010-10-21 19 views

Antwort

79

Ja, es ist möglich. Das wird es tun. Sagen wir die Enum haben

public enum MyEnum 
{ 
    [Description("MyEnum1 Description")] 
    MyEnum1, 
    [Description("MyEnum2 Description")] 
    MyEnum2, 
    [Description("MyEnum3 Description")] 
    MyEnum3 
} 

Dann können wir die Object als

xmlns:MyEnumerations="clr-namespace:MyEnumerations" 
<ObjectDataProvider MethodName="GetValues" 
       ObjectType="{x:Type sys:Enum}" 
       x:Key="MyEnumValues"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="MyEnumerations:MyEnum" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

Und für die List-Box verwenden wir die Itemssource auf MyEnumValues ​​und anzuwenden, um eine ItemTemplate mit einem Konverter eingestellt.

<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8" 
     ItemsSource="{Binding Source={StaticResource MyEnumValues}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Und im Konverter erhalten wir die Beschreibung und senden Sie es

public class EnumDescriptionConverter : IValueConverter 
{ 
    private string GetEnumDescription(Enum enumObj) 
    { 
     FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); 

     object[] attribArray = fieldInfo.GetCustomAttributes(false); 

     if (attribArray.Length == 0) 
     { 
      return enumObj.ToString(); 
     } 
     else 
     { 
      DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute; 
      return attrib.Description; 
     } 
    } 

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Enum myEnum = (Enum)value; 
     string description = GetEnumDescription(myEnum); 
     return description; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Empty; 
    } 
} 

Die GetEnumDescription Methode sollte wahrscheinlich woanders hingehen, aber Sie bekommen die Idee :)

+0

Danke, werde dies jetzt ausprobieren :) –

+4

Ich liebe es, ganked es. Ich benutzte ein wenig linq, um GetEnumDescription zu paaren, Sie können es hier hangeln http://pastebin.com/XLm9hbhG – Will

+2

So müssen Sie einen Konverter für jede Art von enum machen? – Carlo

0

Sie können eine Ressource-Datei definieren in Ihrem Projekt (* .resx-Datei). In dieser Datei müssen Sie „Schlüssel-Wert-Paare“, so etwas wie folgt definieren:

"YellowCars" : "Yellow Cars", 
"RedCars" : "Red Cars", 

und so weiter ...

Die Tasten sind gleich zu Ihrer ENUM-Einträge, so etwas wie folgt aus:

public enum CarColors 
{ 
    YellowCars, 
    RedCars 
} 

und so weiter ...

Wenn Sie WPF verwenden Sie in Ihrem XAML-Code so etwas wie dies umsetzen kann:

<ComboBox ItemsSource="{Binding Source={StaticResource CarColors}}" SelectedValue="{Binding CarColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource CarColorConverter}}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Dann müssen Sie Ihren Converter, so etwas schreiben:

using System; 
using System.Globalization; 
using System.Resources; 
using System.Windows.Data; 

public class CarColorConverter : IValueConverter 
{ 
    private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors)); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var key = ((Enum)value).ToString(); 
     var result = CarColors.GetString(key); 
     if (result == null) { 
      result = key; 
     } 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Meine Antwort kommt 7 Jahre zu spät ;-) Aber vielleicht kann es von jemand anderem verwendet werden!

Verwandte Themen