2009-05-18 16 views
14

मैंने चारों ओर खोज की है और यह कम्बोबॉक्स में enums को बांधना बहुत आसान लगता है, बस Enum मानों को Stic Enum.GetValues ​​विधि से ऑब्जेक्टडेटाप्रोवाइडर के माध्यम से तारों की सूची के रूप में पुनर्प्राप्त करें, हालांकि मैं इसे काम नहीं कर सकता। त्रुटि टाइप है संपर्क एक्सपोर्ट टाइप टाइप नहीं किया गया था।कॉम्बोबॉक्स एनम के लिए बाध्यकारी, मैंने क्या गलत किया?

मेरे पास ContactExportType नामक एक enum है, यह 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

धन्यवाद क्रिस:

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

यहाँ EnumValues ​​मार्कअप विस्तार के लिए कोड है। मैं अलग-अलग चीजों की कोशिश करने के बाद एक्सएएमएल में ऐसा नहीं कर सका। ऐसा लगता है कि यह कक्षा संरचना में एक स्तर का समर्थन नहीं करता है। मैंने इसे काम करने के लिए क्या किया है, आइटम को स्रोत में बाध्य करना है। combobox.ItemsSource = Enum.GetValues ​​(टाइपऑफ (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> 

वैसे, वहाँ के मूल्यों के लिए बाध्य करने के लिए एक सरल तरीका है ऑब्जेक्टडेटाप्रोवाइडर का उपयोग किए बिना एक enum। यह एक कस्टम मार्कअप विस्तार पर आधारित है: आपकी मदद के लिए

[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 स्थानीय नहीं है तो आप यह कैसे करते हैं? – gonzobrains

+0

@gonzobrains, आपका क्या मतलब है "स्थानीय नहीं"? उपर्युक्त उदाहरण में, 'लोकल' केवल एक एक्सएमएल नेमस्पेस उपसर्ग है जो सीएलआर नेमस्पेस में मैप किया गया है जहां enum परिभाषित किया गया है। आप किसी भी उपसर्ग का उपयोग कर सकते हैं और इसे किसी भी सीएलआर नेमस्पेस पर मैप कर सकते हैं। –

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" /> 
01 होना चाहिए:

यह मैं क्या है Enum ढांचे वर्ग अपने पूरी तरह से योग्य typename पैरामीटर अंक में typename को Enum अंक:

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

sys होना चाहिए।

जांच 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

यदि टीशर्ट साइज अलग-अलग वर्ग और नामस्थान में है, तो आप इसे कैसे निर्दिष्ट करते हैं? मेरा कोड देखें ... धन्यवाद, एंजेला – Angela

+0

आपको इसे संदर्भित करने के लिए एक xmlns नेमस्पेस जोड़ना होगा ---- xmlns: myenum = "assembly; ..." –

+0

आपके स्थानीय xmlns ठीक है (मान लीजिए कि आप कहां enum पर है) –

संबंधित मुद्दे