2009-05-18 9 views
14

He buscado y me parece muy fácil enlazar enumeraciones al cuadro combinado, solo recuperar valores Enum como una lista de cadenas a través de un ObjectDataProvider del método Enum.GetValues ​​estático, sin embargo, no puedo hacer que funcione. El error es Type ContactExportType no se encontró.ComboBox vinculante a enum, ¿qué hice mal?

Tengo una enumeración llamada ContactExportType, que reside en la clase Enums. Esta clase es parte del espacio de nombres CEM.Marketing.Objects.

Esto es lo que tengo:

<UserControl 
xmlns:local="clr-namespace:CEM.Marketing.Objects" 
xmlns:sys="clr-namespace:System;assembly=mscorlib"> 

<Grid> 
<Grid.Resources> 
     <ObjectDataProvider MethodName="GetValues" 
        ObjectType="{x:Type sys:Enum}" 
        x:Key="ContactExportTypes"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:ContactExportType" /> 
     </ObjectDataProvider.MethodParameters> 

    </ObjectDataProvider> 
    </Grid.Resources> 

</Grid> 
<ComboBox 
     ItemsSource="{Binding {StaticResource ContactExportTypes}}" 
... 

Gracias, Angela

+1

Gracias a Chris por su ayuda. No pude hacerlo en XAML después de probar cosas diferentes. Parece que no admite un nivel inferior en la estructura de clases. Lo que hice para que funcione es enlazar itemSource en el código de atrás. combobox.ItemsSource = Enum.GetValues ​​(typeof (Enums.ContactExportType)); – Angela

Respuesta

36

Para acceder a un tipo anidado, se debe utilizar el signo "+" separador:

<ObjectDataProvider MethodName="GetValues" 
        ObjectType="{x:Type sys:Enum}" 
        x:Key="ContactExportTypes"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="local:Enums+ContactExportType" /> 
    </ObjectDataProvider.MethodParameters> 

</ObjectDataProvider> 

Por cierto, hay una manera más sencilla que se unen a los valores de una enumeración, sin usar un ObjectDataProvider. Se basa en una extensión de marcado personalizado:

<ComboBox ItemsSource="{local:EnumValues local:Enums+ContactExportType}"/> 

Este es el código para la extensión EnumValues ​​marcado:

[MarkupExtensionReturnType(typeof(object[]))] 
public class EnumValuesExtension : MarkupExtension 
{ 
    public EnumValuesExtension() 
    { 
    } 

    public EnumValuesExtension(Type enumType) 
    { 
     this.EnumType = enumType; 
    } 

    [ConstructorArgument("enumType")] 
    public Type EnumType { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (this.EnumType == null) 
      throw new ArgumentException("The enum type is not set"); 
     return Enum.GetValues(this.EnumType); 
    } 
} 
+0

¿Cómo se hace esto si su enumeración no es local? – gonzobrains

+0

@gonzobrains, ¿qué quiere decir "no local"? En el ejemplo anterior, 'local' es simplemente un prefijo de espacio de nombres XML mapeado en el espacio de nombres CLR donde se define la enumeración. Puede usar cualquier prefijo y asignarlo a cualquier espacio de nombre CLR. –

1
<ObjectDataProvider MethodName="GetValues" 
        ObjectType="{x:Type local:Enums}" 
        x:Key="ContactExportTypes"> 

debe ser

<ObjectDataProvider MethodName="GetValues" 
        ObjectType="{x:Type sys:Enum}" 
        x:Key="ContactExportTypes"> 

y

<x:Type TypeName="local:ContactExportType" /> 

debería ser

<x:Type TypeName="CEM.Marketing.Objects.ContactExportType"/> 

sys: puntos de enumeración a la clase Enum marco typename en los puntos de parametrización en nombre de tipo completo.

cheque Bea Stollnitz's blog

<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="odp"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="namespace.class.TShirtSizes"/> 
      </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

<ComboBox ItemsSource="{Binding Source={StaticResource odp}}" IsSynchronizedWithCurrentItem="true"/> 
+0

Si TShirtSizes está en diferente clase y espacio de nombres, ¿cómo lo especifica? Ver mi código ... Gracias, Angela – Angela

+0

tiene que agregar un espacio de nombres xmlns para referérselo ---- xmlns: myenum = "assembly; ..." –

+0

su xmlns local está bien (suponiendo que es donde enum está en) –