2010-10-21 12 views

Odpowiedz

79

Tak, jest to możliwe. To zrobi to. Że mamy enum

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

Wtedy możemy użyć ObjectDataProvider jak

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> 

I ListBox możemy ustawić ItemsSource do MyEnumValues ​​i zastosować ItemTemplate z konwerterem.

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

I w konwerterze otrzymujemy opis i odesłać go

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

Sposób GetEnumDescription prawdopodobnie powinien iść gdzieś indziej, ale masz pomysł :)

+0

Dzięki, spróbuję teraz :) –

+4

Uwielbiam to, ganked to. Użyłem małego linqa, aby sparować GetEnumDescription, możesz go zszyć tutaj http://pastebin.com/XLm9hbhG – Will

+2

Więc musisz zrobić konwerter dla każdego typu enum? – Carlo

0

Można zdefiniować plik ressource w twoim projekcie (plik * .resx). W tym pliku należy zdefiniować „key-value-par”, coś takiego:

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

i tak dalej ...

Klawisze są równa się swoimi enum-wpisów, coś takiego:

public enum CarColors 
{ 
    YellowCars, 
    RedCars 
} 

i tak dalej ...

Podczas korzystania z WPF można zaimplementować w XAML-code, coś takiego:

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

Następnie należy napisać konwerter coś takiego:

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

Moja odpowiedź przychodzi 7 lat za późno ;-) Ale może to mogą być wykorzystane przez kogoś innego!