【问题标题】:ComboBox binding to enum, what did I do wrong?ComboBox绑定到枚举,我做错了什么?
【发布时间】:2010-10-27 01:47:03
【问题描述】:

我已经四处搜索,似乎很容易将枚举绑定到组合框,只需通过 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}}"
...

谢谢, 安吉拉

【问题讨论】:

  • 感谢克里斯的帮助。在尝试了不同的事情之后,我无法在 XAML 中做到这一点。似乎它不支持类结构中的一层。我所做的就是在后面的代码中绑定 itemSource。 combobox.ItemsSource = Enum.GetValues(typeof (Enums.ContactExportType));

标签: wpf enums combobox


【解决方案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);
    }
}

【讨论】:

  • 如果你的枚举不是本地的,你怎么做?
  • @gonzobrains,“非本地”是什么意思?在上面的示例中,local 只是映射到定义枚举的 CLR 命名空间的 XML 命名空间前缀。您可以使用任何前缀并将其映射到任何 CLR 命名空间。
【解决方案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 框架类 参数中的类型名指向您的完全限定类型名。

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

【讨论】:

  • 如果 TShirtSizes 在不同的类和命名空间中,你如何指定它?查看我的代码...谢谢,安吉拉
  • 你必须添加一个 xmlns 命名空间来引用它---- xmlns:myenum="assembly;..."
  • 你的本地 xmlns 没问题(假设这是你枚举所在的位置)
  • 我将 ObjectType="{x:Type local:Enums}" 改为 ObjectType="{x:Type sys:Enum}",还是一样的问题..
  • 将您的 更改为“CEM.Marketing.Objects.ContactExportType”
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2016-09-15
  • 2023-03-03
相关资源
最近更新 更多