ComboBox привязка к перечислению, что я сделал неправильно?

Я искал вокруг, и кажется очень легко связать перечисления с combobox, просто получить значения Enum в виде списка строк с помощью ObjectDataProvider из статического метода Enum.GetValues, однако я не могу заставить его работать. Ошибка: тип ContactExportType не найден.

У меня есть перечисление, называемое ContactExportType, оно находится в классе Enums. Этот класс является частью пространства имен CEM.Marketing.Objects.

Это то, что у меня есть:

<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}}"
...

Спасибо, Анжела

Ответ 1

Чтобы получить доступ к вложенному типу, вы должны использовать разделитель "+":

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

</ObjectDataProvider>

Кстати, существует более простой способ привязки к значениям перечисления без использования ObjectDataProvider. Он основан на пользовательском расширении разметки:

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

Вот код расширения разметки EnumValues:

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

Ответ 2

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

должен быть

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

и

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

должен быть

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

sys: Enum указывает на класс среды Enum typename в параметре указывает на ваше полное имя типа.

проверить Блог Bea Stollnitz

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