2013-03-22 16 views
7

Hallo ich eine Enumeration mit Beschreibungen zu einer Combobox binden möchten:WPF Wie eine Enumeration mit Beschreibungen zu einer Combobox binden

ich nächste Enum bekam:

:

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

Ich habe versucht,

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

Kann es nicht schaffen, dies zu tun 1 kennt eine einfache Lösung?

Vielen Dank im Voraus!

+0

Für ein alternativer Ansatz siehe http://stackoverflow.com/questions/9242345/show-enum-in-a-combobox/9327548#9327548 – Phil

Antwort

8

Dies kann mit einem Konverter und Artikel Vorlage für Ihre ComboBox getan werden.

Hier ist der Konverter-Code, der, wenn er einen Enum gebunden wird die Beschreibung Wert zurück:

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

Dann in Ihrem XAML Sie verwenden und Elementvorlage benötigen.

<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

Was ist MyEnums und 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

Erklärung ...? – lpapp

0

RSmaller hat eine gute Antwort, und ist das, was ich auch verwenden, mit einer Einschränkung. Wenn Sie mehr als ein Attribut auf Aufzählungen, und Beschreibung ist nicht die erste aufgelistet dann seine „GetEnumDescription“ Methode wird eine Ausnahme werfen ...

Hier ist eine etwas sicherere Version:

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