2013-03-22 20 views
7

Ciao Voglio legare un enum con descrizioni ad una casella combinata:WPF Come associare un enum con descrizioni a una casella combinata

ho ottenuto prossimo enum:

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

ho provato questo:

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

Non riesco a eseguire questa operazione 1 conosce una soluzione semplice?

Grazie in anticipo!

+0

Per un approccio alternativo vedi http://stackoverflow.com/questions/9242345/show-enum-in-a-combobox/9327548#9327548 – Phil

risposta

8

Questo può essere fatto utilizzando un convertitore e modello di articolo per il tuo comboBox.

Ecco il codice del convertitore, che quando si lega ad un enum restituirà il valore Descrizione:

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

Poi, nel tuo XAML è necessario utilizzare e modello di elemento.

<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

What's MyEnums e 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

Spiegazione ...? – lpapp

0

RSmaller ha una buona risposta, ed è quello che uso come pure, con un avvertimento. Se si dispone di più di un attributo sulle enumerazioni, e descrizione non è la prima elencato poi il suo metodo "GetEnumDescription" un'eccezione ...

Ecco una versione leggermente più sicuro:

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