2013-03-22 31 views
7

Hi Chcę powiązać enum z opisami do combobox:WPF Jak powiązać enum z opisami do combobox

mam następny ENUM:

public enum ReportTemplate 
    { 
    [Description("Top view")] 
    1, 
    [Description("Section view")] 
    2 
    } 

Próbowałem to:

<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type System:Enum}" 
    x:Key="ReportTemplateEnum"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="Helpers:ReportTemplate" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

    <Style x:Key="ReportTemplateCombobox" TargetType="dxe:ComboBoxEditSettings"> 
     <Setter Property="ItemsSource" 
     Value="{Binding Source={x:Type Helpers:ReportTemplate}}"/> 
     <Setter Property="DisplayMember" Value="Description" /> 
     <Setter Property="ValueMember" Value="Value" /> 
    </Style> 

Nie udaje się to zrobić, każdy 1 zna proste rozwiązanie?

Z góry dziękuję!

+0

Dla alternatywne podejście zobacz http://stackoverflow.com/questions/9242345/show-enum-in-a-combobox/9327548#9327548 – Phil

Odpowiedz

8

Można to zrobić za pomocą konwertera i szablonu przedmiotu dla swojego comboBox.

Oto kod konwerter, który po związaniu z wyliczenia zwróci wartość Opis:

namespace FirmwareUpdate.UI.WPF.Common.Converters 
{ 
    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; 
     } 
    } 
} 

Następnie w XAML trzeba użyć i szablon poz.

<ComboBox Grid.Row="1" Grid.Column="1" Height="25" Width="100" Margin="5" 
       ItemsSource="{Binding Path=MyEnums}" 
       SelectedItem="{Binding Path=MySelectedItem}" 
       > 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
+4

Co to jest MyEnums i MySelectedItem? – Doub

-3
public enum ReportTemplate 
{ 
[Description("Top view")] 
Top_view=1, 
[Description("Section view")] 
Section_view=2 
} 

ComboBoxEditSettings.ItemsSource = EnumHelper.GetAllValuesAndDescriptions(new 
List<ReportTemplate> { ReportTemplate.Top_view, ReportTemplate.Section_view }); 
+0

Wyjaśnienie ...? – lpapp

0

RSmaller ma dobrej odpowiedzi, a jest jeden używam jak dobrze, z jednym zastrzeżeniem. Jeśli masz więcej niż jeden atrybut na swoje teksty stałe, a opis nie jest pierwszy na liście, a następnie jego „GetEnumDescription” metoda wygeneruje wyjątek ...

Oto nieco bezpieczniejsza wersja:

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 = null; 

      foreach(var att in attribArray) 
      { 
       if (att is DescriptionAttribute) 
        attrib = att as DescriptionAttribute; 
      } 

      if (attrib != null) 
       return attrib.Description; 

      return enumObj.ToString(); 
     } 
    }