2009-05-18 67 views
14

我已经搜索过,看起来很容易将枚举绑定到组合框,只是通过静态Enum.GetValues方法中的ObjectDataProvider检索Enum值作为字符串列表,但是我无法让它工作。错误是类型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

克里斯感谢您的帮助。在尝试不同的事情之后,我无法在XAML中完成这项工作。似乎它不支持类结构中的一个层次。我所做的工作就是在后面的代码中绑定itemSource。 combobox.ItemsSource = Enum.GetValues(typeof(Enums.ContactExportType)); – Angela 2009-05-18 16:32:45

回答

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); 
    } 
} 
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:枚举指向枚举框架类 类型名称在参数指向完全限定的类型名称。

检查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 2009-05-18 15:45:51

+0

你必须添加一个xmlns命名空间参考它---- xmlns:myenum =“assembly; ...” – 2009-05-18 15:46:34

相关问题