我似乎无法从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/
答案 0 :(得分:4)
MSDN说:
您的自定义类不能是嵌套类。嵌套类和 一般CLR使用语法中的“dot”会干扰其他WPF 和/或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;
}
}