Ich bin verrückt geworden, weil ich eine Combobox an eine enum typisierte Eigenschaft einer Klasse gebunden habe, wo die enum selbst in derselben Klasse deklariert ist.Eine ComboBox an ein enum verschachteln, das in einer Klasse verschachtelt ist
Ich versuche der hier angegebenen Antwort zu folgen (wpf combobox binding to enum what i did wrong?) Insbesondere verwende ich den vorgeschlagenen MarkupExtension-Code und den passenden Xaml-Code.
Mein Arbeitscode lautet:
in einer separaten Datei, die Enum definieren.
namespace EnumTest
{
public enum TestEnum {one, two, three, four };
}
Klasse, die die Enum verwendet (Beachten Sie, dass das Property Code entfernt wurde, 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 für Anzeige der 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);
}
}
}
Und der XAML-Code, der die Daten verwendet wird angezeigt: Die obige
<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>
ist alles gut und gut, aber ich möchte die Enum innerhalb die Test-Klasse definieren und die Enum Graben aus an die definiert ist globaler Geltungsbereich. 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, die ich an die entsprechenden XAML-Syntax als Wesen spielt bezeichnet:
<ComboBox Name="cmbBox"
...
ItemsSource="{Binding Source={w:EnumValues EnumType=w:Test+TestEnum}}"
...
/>
Aber diese (Art) für mich nicht funktioniert. Wenn ich einen bereinigter Build erhalte ich ein „gelungen Build“ Nachricht in der Statusleiste VS 2008, aber ich habe auch einen Fehler in der XAML gemeldet
Type 'Test+TestEnum' was not found.
Aber der Code ausgeführt wird, wie erwartet!
Dies bedeutet jedoch, dass der XAML-Designer nicht geladen wird. Also bin ich irgendwie damit beschäftigt, noch mehr WPF-Arbeit zu machen, bis ich den XAML-Fehler löschen kann.
Ich frage mich jetzt, ob dies ein VS 2008 SP1 Problem ist, und kein Problem meinerseits.
bearbeiten
- Hergestellt mein Problem Aussage deutlicher.
- Versuchte erste Lösung Joel, aber ich endete mit dem Code oben läuft und 2 XAML-Fehler
- Versuchte zweite Lösung Joel und arbeitete gerade aus der Box - so mit, dass man ich werde!
Hinweise Die SO Frage, die ich von Anwendungen dieser Art der Syntax für den XAML die Markupextension Code bekam:
<ComboBox ItemsSource="{w:EnumValues w:TestEnum}"/>
Wenn ich, dass ich einen Kompilierungsfehler erhalten, dass Kein EnumValues-Konstruktor benötigt 1 Parameter. Ich habe etwas gegoogelt und dies scheint ein Fehler in VS zu sein. Ich verwende VS 2008 SP1. Ich habe einige Kommentare gesehen, die darauf hinwiesen, dass es in der VS 2010 Beta ist. Wie auch immer, das ist, warum ich die XAML-Syntax von
<ComboBox ItemsSource="{w:EnumValues EnumType=w:TestEnum}"/>
Da diese Syntax Werke verwenden!
In Bezug auf den Fehler über den Konstruktor tritt es nur im Designer auf.Es sollte ansonsten gut funktionieren. Um diesen Fehler zu vermeiden, definieren Sie die Markup-Erweiterung in einer separaten Assembly. –
@Thomas: Ich hatte vergessen, wie der Designer streitsüchtig sein kann, welche Typen wann und wo erstellt werden und wie sie instanziiert werden. –
@Joel - Und Anfänger wpf Programmierer wissen diese Art von wie? Zu wissen, wie man eine Klasse in eine separate Assembly stellt, um einen Teil des Build-Tools zu erfüllen, ist IMHO eher unklar. Aber ich werde weiter damit herumalbern, bis ich ein vernünftiges Verständnis habe. Danke noch einmal. –