来自XAML的引用嵌套枚举类型

时间:2012-11-13 20:19:33

标签: c# xaml

我似乎无法从XAML引用公共嵌套枚举类型。我有一个班级

namespace MyNamespace
{
  public class MyClass
  {
    public enum MyEnum
    {
       A,
       B,
    }
  }
}

我尝试在Xaml中引用MyEnum,如下所示:

xmlns:MyNamespace="clr-namespace:MyNamespace;assembly=MyApp"
....

{x:Type MyNamespace:MyClass:MyEnum}    // DOESN'T WORK

但是VS抱怨它无法找到公共类型MyEnum。我还尝试使用基于this post ...

的答案之一的+语法
{x:Type MyNamespace:MyClass+MyEnum}    // DOESN'T WORK

但这也不起作用。

请注意,x:Static 使用+语法:

{x:Static MyNamespace:MyClass+MyEnum.A}  // WORKS

如果我从MyEnum移出MyClass,我也可以参考它。但不是如果它是嵌套的......

那我错过了什么?如何使用x:Type从XAML引用嵌套枚举? (请注意,我不是要尝试实例化任何内容,只需引用该类型)。

更新

看起来这只是VS 2010设计师的一个错误。设计师抱怨Type MyNamespace:MyClass+MyEnum was not found。但应用程序似乎运行并正确访问嵌套类型。我也尝试使用嵌套类,它在运行时工作。

可能的开放式错误:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/12f3e120-e217-4eee-ab49-490b70031806/

相关主题:Design time error while writing Nested type in xaml

2 个答案:

答案 0 :(得分:4)

MSDN说:

  

您的自定义类不能是嵌套类。嵌套类和   一般CLR使用语法中的“dot”会干扰其他WPF   和/或XAML功能,例如附加属性。

类似的问题在这里:Creating an instance of a nested class in XAML

答案 1 :(得分:1)

有点晚了,但是我使用了标记扩展,然后在我的xaml中使用了以下引用来引用组合框中的嵌套枚举:

xmlns:MyNamespace="clr-namespace:MyNamespace;assembly=MyApp"

...

ItemsSource="{Binding Source={resource:EnumBindingSource {x:Type MyNamespace:MyClass+MyEnum}}}"

MarkupExtension的代码取自here

public class EnumBindingSourceExtension : MarkupExtension
{
    private Type _enumType;
    public Type EnumType
    {
        get { return this._enumType; }
        set
        {
            if (value != this._enumType)
            {
                if (null != value)
                {
                    Type enumType = Nullable.GetUnderlyingType(value) ?? value;
                    if (!enumType.IsEnum)
                        throw new ArgumentException("Type must be for an Enum.");
                }

                this._enumType = value;
            }
        }
    }

    public EnumBindingSourceExtension() { }

    public EnumBindingSourceExtension(Type enumType)
    {
        this.EnumType = enumType;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (null == this._enumType)
            throw new InvalidOperationException("The EnumType must be specified.");

        Type actualEnumType = Nullable.GetUnderlyingType(this._enumType) ?? this._enumType;
        Array enumValues = Enum.GetValues(actualEnumType);

        if (actualEnumType == this._enumType)
            return enumValues;

        Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1);
        enumValues.CopyTo(tempArray, 1);
        return tempArray;
    }
}