我一直在疯狂与组合框绑定到一个类,其中,枚举本身在同一个类中声明的枚举类型属性。
我试图按照这里提供的答案(WPF组合框结合枚举我做错了什么?)具体我使用的是建议的MarkupExtension代码和匹配的XAML代码。
我的工作代码为:
定义枚举在一个单独的文件。
namespace EnumTest
{
public enum TestEnum {one, two, three, four };
}
使用枚举(注意的PropertyChanged代码已被删除,以简化的东西)类:
namespace EnumTest
{
public class Test : INotifyPropertyChanged
{
private TestEnum _MyVar;
public TestEnum MyVar {
get { return _MyVar; }
set
{
_MyVar = value;
OnPropertyChanged("MyVar");
}
}
public Test()
{
_MyVar = TestEnum.three;
}
}
}
使用该类的程序文件:
namespace EnumTest
{
public partial class Window1 : Window
{
Test _oTest = new Test();
public Window1()
{
InitializeComponent();
cmbBox.DataContext = _oTest;
}
}
}
用于显示所述枚举扩展方法
namespace EnumTest
{
[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);
}
}
}
并且,用于显示的数据的XAML代码:
<Window x:Class="EnumTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:w="clr-namespace:EnumTest"
Title="Window1" Height="300" Width="300">
<Grid>
<ComboBox Name="cmbBox"
Height="20"
Width="80"
ItemsSource="{Binding Source={w:EnumValues EnumType=w:TestEnum}}"
SelectedItem="{Binding Path=MyVar}"
/>
</Grid>
</Window>
以上是所有良好和花花公子,但我想定义测试类中的枚举和在全球范围内被定义沟枚举。 像这样:
namespace EnumTest
{
public class Test : INotifyPropertyChanged
{
// Declare Enum **INSIDE** the class
public enum TestEnum {one, two, three, four };
private TestEnum _MyVar;
public TestEnum MyVar {
get { return _MyVar; }
set
{
_MyVar = value;
OnPropertyChanged("MyVar");
}
}
public Test()
{
_MyVar = TestEnum.three;
}
}
}
所述SO质疑我称为暗指匹配XAML语法之中:
<ComboBox Name="cmbBox"
...
ItemsSource="{Binding Source={w:EnumValues EnumType=w:Test+TestEnum}}"
...
/>
但是,这(样的)不会为我工作。 当我做一个干净的构建,我得到一个“构建成功”的消息在VS 2008状态栏上,但我也得到一个错误在XAML中被报告
Type 'Test+TestEnum' was not found.
但代码运行正常!
然而,这意味着,XAML设计将不会加载。 所以,我有点拧在做任何更多的WPF工作,直到我可以清除XAML错误。
我现在想,如果这是一个VS 2008 SP1的问题,不是我的一个问题。
编辑
- 使我的问题的陈述更加明确。
- 试图乔尔的第一个解决方案,但我最终的代码运行和 2个XAML错误
- 试图Joel的第二个解决办法,制定开箱的 - 所以我有一个去!
备注 SO问题,我得到的MarkupExtension代码使用语法的XAML的这种风格:
<ComboBox ItemsSource="{w:EnumValues w:TestEnum}"/>
当我使用,我得到一个编译错误,说没有EnumValues构造函数接受1个参数。 我做了一些谷歌搜索,这似乎是在VS.错误 我使用VS 2008 SP1。 我也看到一些评论说,提到它在VS 2010 Beta版之中。 不管怎么说,这就是为什么我用的XAML语法
<ComboBox ItemsSource="{w:EnumValues EnumType=w:TestEnum}"/>
由于这句法的作品!