2009-05-18 4 views
14

Çevrede arama yaptım ve enumları combobox'a bağlamak çok kolay görünüyor, enum değerlerini bir ObjectDataProvider üzerinden statik Enum.GetValues ​​yönteminden bir dizi listesi olarak almam ancak işe yaramayabilirim. Hata, ContactExportType Türü bulunamadı.ComboBox ciltleme ciltleme, neyi yanlış yaptım?

ContactExportType adlı bir numaram var, Enums sınıfında bulunuyor. Bu sınıf CEM.Marketing.Objects ad alanının bir parçasıdır.

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

sayesinde Angela

+1

Teşekkür Chris Yardımlarınız için:

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

EnumValues ​​biçimlendirme uzantısı için kodudur. Farklı şeyler denedikten sonra XAML'de yapamadım. Sınıf yapısında bir seviyeyi desteklemiyor gibi görünüyor. Bunu yapmak için yaptığım şey, itemSource'u kodun arkasına bağlamaktır. combobox.ItemsSource = Enum.GetValues ​​(typeof (Enums.ContactExportType)); – Angela

cevap

36

yuvalanmış bir türü erişmek için, "+" ayırıcı kullanmalısınız: Bu arada

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

</ObjectDataProvider> 

, değerlerine bağlamak için daha basit bir yol var Bir ObjectDataProvider kullanmadan bir enum. Özel bir işaretleme uzantısı dayanıyor:

[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

Enum yerel değilse, bunu nasıl yaparsınız? – gonzobrains

+0

@gonzobrains, "yerel değil" ne demek istiyorsun? Yukarıdaki örnekte, "local", enum tanımlandığı CLR ad alanına eşlenen bir XML ad alanı önekidir. Herhangi bir öneki kullanabilir ve herhangi bir CLR ad alanına eşleyebilirsiniz. –

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

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

ve

<x:Type TypeName="local:ContactExportType" /> 
01 olmalıdır:

Bu

i ne var Enum çerçeve sınıfına senin tam TypeName parametre noktalarında typename için Enum puan:

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

sys olmalıdır.

onay 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

Eğer TShirtSizes farklı sınıf ve ad alanındaysa, bunu nasıl belirlersiniz? Koduma bakın ... Teşekkürler, Angela – Angela

+0

referans için xmlns ad alanı eklemeniz gerekir ---- xmlns: myenum = "assembly; ..." –

+0

yerel xmlnsiniz iyidir (=) –