Binden einer ComboBox an eine in einer Klasse verschachtelte Enumeration

Ich war verrückt danach, ein Kombinationsfeld an eine enum-typisierte Eigenschaft einer Klasse zu binden, bei der die Enumeration selbst in derselben Klasse deklariert wird.

Ich versuche der hier gegebenen Antwort zu folgen(wpf combobox bindet an enum was ich falsch gemacht habe?) Insbesondere verwende ich den vorgeschlagenen MarkupExtension-Code und den passenden XAML-Code.

Mein Arbeitscode ist:

Definieren der Aufzählung in einer separaten Datei.

namespace EnumTest
{
    public enum TestEnum {one, two, three, four };
}

Klasse, die die Aufzählung verwendet (Beachten Sie, dass der propertyChanged-Code entfernt wurde, um die Dinge zu vereinfachen):

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;
        }
    }
}

Programmdatei, die die Klasse verwendet:

namespace EnumTest
{
    public partial class Window1 : Window
    {
        Test _oTest = new Test();

        public Window1()
        {
            InitializeComponent();
            cmbBox.DataContext = _oTest;
        }
    }
 }

Erweiterungsmethode zum Anzeigen der Aufzählung

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);
        }
    }
}

Und der XAML-Code, mit dem die Daten angezeigt werden:

<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>

Das obige ist alles gut und gut, aber ich möchte das Enum definiereninnerhalb die Testklasse und lassen die Enumeration aus dem globalen Gültigkeitsbereich verschwinden. Wie so:

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;
        }
    }
}

Die SO-Frage, auf die ich mich bezog, spielt auf die passende XAML-Syntax an:

        <ComboBox Name="cmbBox" 
                  ...
                  ItemsSource="{Binding Source={w:EnumValues EnumType=w:Test+TestEnum}}" 
                  ...
                  />

Aber das (irgendwie) funktioniert bei mir nicht. Wenn ich einen sauberen Build durchführe, wird in der VS 2008-Statusleiste die Meldung "Build succeeded" angezeigt, in der XAML wird jedoch auch ein Fehler gemeldet

Type 'Test+TestEnum' was not found.  

Aber der Code läuft wie erwartet!

Dies bedeutet jedoch, dass der XAML-Designer nicht geladen wird. Also bin ich irgendwie bescheuert, mehr wpf-Arbeit zu erledigen, bis ich den xaml-Fehler beheben kann.

Ich frage mich jetzt, ob dies ein VS 2008 SP1-Problem ist und meinerseits kein Problem.

Bearbeiten

Habe meine Problemstellung expliziter gemacht.Versuchte Joel erste Lösung, aber ich endete mit dem Code ausgeführtund 2 xaml fehlerVersuchte Joels 2. Lösung und das hat sofort funktioniert - also mache ich das!

Anmerkungen Die SO-Frage, von der ich den MarkupExtension-Code erhalten habe, verwendet diesen Syntaxstil für das xaml:

<ComboBox ItemsSource="{w:EnumValues w:TestEnum}"/>

Wenn ich das verwende, erhalte ich einen Kompilierungsfehler, der besagt, dass kein EnumValues-Konstruktor 1 Parameter akzeptiert. Ich habe ein bisschen gegoogelt und das scheint ein Fehler in VS zu sein. Ich verwende VS 2008 SP1. Ich habe einige Kommentare gesehen, die darauf hinwiesen, dass es sich um eine Beta-Version von VS 2010 handelt. Aus diesem Grund verwende ich die xaml-Syntax von

<ComboBox ItemsSource="{w:EnumValues EnumType=w:TestEnum}"/>

Wie diese Syntax funktioniert!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage