2009-05-18 3 views
14

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

У меня есть перечисление, называемое 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}}" 
... 

Спасибо, Angela

+1

Спасибо Крис за вашу помощь. Я не мог сделать это в XAML, пробовав разные вещи. Похоже, что он не поддерживает один уровень в структуре класса. То, что я сделал, чтобы заставить его работать, - связать itemSource в коде позади. combobox.ItemsSource = Enum.GetValues ​​(typeof (Enums.ContactExportType)); – Angela

ответ

36

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

<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); 
    } 
} 
+0

Как вы это делаете, если ваше перечисление не является локальным? – gonzobrains

+0

@ gonzobrains, что вы имеете в виду «не местные»? В приведенном выше примере «local» представляет собой просто префикс пространства имен XML, сопоставленный с пространством имен CLR, где определено перечисление. Вы можете использовать любой префикс и сопоставить его с любым пространством имен CLR. –

1
<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 в точках параметров для полного имени TypeName.

проверка 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

Если TShirtSizes находится в другом классе и пространстве имен, как вы его определяете? См. Мой код ... Спасибо, Angela – Angela

+0

вам нужно добавить пространство имен xmlns для его ссылки ---- xmlns: myenum = "assembly; ..." –

+0

ваши локальные xmlns в порядке (при условии, что вы перечислите is at) –

Смежные вопросы