Я схожу с ума, привязывая combobox к типизированному свойству перечисления класса, где само перечисление объявляется в том же классе.
Я пытаюсь выполнить приведенный здесь ответ (привязка wopf combobox к перечислению, что я сделал не так?) В частности, я использую предложенный код MarkupExtension и соответствующий xaml код.
Мой рабочий код:
Определение Enum в отдельном файле.
namespace EnumTest
{
    public enum TestEnum {one, two, three, four };
}
Класс, который использует Enum (обратите внимание, что код 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;
        }
    }
 }
Метод расширения для отображения Enum
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>
Выше все хорошо и денди, но я хочу определить класс Enum внутри, а также указать, что Enum определяется в глобальной области. Например:
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 с пакетом обновления 1 (SP1), а не проблемой с моей стороны.
Edit
- Сделал мою задачу более явной.
 - Пробовал Joel 1-е решение, но я закончил с кодом и 2 xaml errors
 - Попробовал Joel 2nd solution, и это работало прямо из коробки - так что я собираюсь с этим!
 
Примечания Вопрос SO, который получил код MarkupExtension, использует этот стиль синтаксиса для xaml:
<ComboBox ItemsSource="{w:EnumValues w:TestEnum}"/>
Когда я использую это, я получаю ошибку компиляции, говоря, что никакой конструктор EnumValues не принимает 1 параметр. Я сделал некоторый googling, и это, кажется, ошибка в VS. Я использую VS 2008 SP1. Я видел некоторые комментарии, которые ссылались на него в бета-версии VS 2010. Во всяком случае, поэтому я использую синтаксис xaml
<ComboBox ItemsSource="{w:EnumValues EnumType=w:TestEnum}"/>
Как работает этот синтаксис!