Entwickler-Ecke

WPF / Silverlight - Enumeration an WPF Combobox binden mit ObjectDataProvider


Oppi35 - Do 30.12.10 16:48
Titel: Enumeration an WPF Combobox binden mit ObjectDataProvider
Hallo Zusammen,

wenn ich die hier genannte Enumeration (TestEnumeration) im Namespace, aber nicht innerhalb einer Klasse definiere, funktioniert alles super. Definiere ich die Enumeration aber innerhalb einer Klasse (class Testclass) bekomme ich keinen gültigen Verweis hin. Habe bereits folg. probiert:
- Type="mapping:Testclass.TestEnumeration"
- Type="mapping:Testclass+TestEnumeration"

Kann mir hier jemand weiterhelfen?

Die Enumeration sieht wie folgt aus:
public enum Testenumeration { a,b,c }


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<Window x:Class="Aktionen_Druckdatensatz.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mapping="clr-namespace:Druckdatensatz_dll;assembly=Druckdatensatz_dll"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:Aktionen_Druckdatensatz"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        
        <ObjectDataProvider x:Key="enumcombo" MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="mapping:TestEnumeration" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>



Gruß Frank


Kha - Do 30.12.10 16:59

XAML unterstützt keine Angabe von Nested Types. Abgesehen davon habe ich den ObjectDataProvider noch nie benutzt, im Code Behind zu binden ist dann doch ein wenig flexibler und unschwurbeliger ;) .


Trashkid2000 - Do 30.12.10 18:32

Hallo,
sieht so aus, als ob nur XAML und der Designer damit Probleme hätten, denn laufen tut es ja mit dem "+" zwischen Kalssennamen und Enum. Habe das mal auf stackoverflow http://stackoverflow.com/questions/1220196/wpf-binding-a-combobox-to-an-enum-nested-in-a-class gefunden:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<Window.Resources>
    <ObjectDataProvider
        MethodName="GetValues"
        ObjectType="{x:Type sys:Enum}"
        x:Key="TestValues">
        <ObjectDataProvider.MethodParameters>
            <w:Type2
                TypeName="w:Test+TestEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
Was das "Type2" ist, weiss ich allerdings nicht. Entweder, es ist eine Selbstimplementierung, oder bei .NET 4.0 mit dabei.
Marko


Kha - Do 30.12.10 19:27

Type2Extension [http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/12f3e120-e217-4eee-ab49-490b70031806] ist eben der Workaround um die beschriebene Einschränkung...


Oppi35 - Fr 31.12.10 00:12

Hallo Zusammen,

vielen Dank erstmal für Eure Hilfe.

Marko, ich verstehe hier zwar auch noch nicht alles, aber zu Deiner Frage bzgl. Type2 kann ich Dir folg. sagen:

Es wurde in Deinem Link eine Klasse Type2Extension erstellt, die von TypeExtension abgeleitet ist.

Bei der Verwendung des Befehls "w:Type2" wird nach der Klasse Type2 gesucht. Wird die Klasse nicht gefunden, wird automatisch "Extension" hinten angehängt und erneut gesucht. Wie dies funktioniert weiß ich noch nicht, steht aber in meinem WPF Buch. Also wird nach der hier erstellten Klasse Type2Extension gesucht (und gefunden).

Genauere Zusammenhänge kann ich Dir leider noch nicht erläutern:)

Ich werde jetzt einfach meine Enumerationen außerhalb der Klassen deklarieren. Dann klappts mit XAML und auch dem Designer und meine ComboBox ist gefüllt.

Also nochmal vielen Dank und einen guten Rutsch!!!

Gruß Frank