25.2 Alternative Datenbindungen
Mit DataContext oder ItemsSource lassen sich Datenquellen an Steuerelemente binden. In XAML gibt es darüber hinaus noch weitere Wege, um auf Datenquellen zuzugreifen:
- ObjectDataProvider
- XmlDataProvider
Ich werde Ihnen an dieser Stelle noch den sehr interessanten ObjectDataProvider vorstellen. Der begrenzte Umfang dieses Buches erlaubt es leider nicht, darüber hinaus den XmlDataProvider zu erläutern.
25.2.1 Die Klasse »ObjectDataProvider«
Lassen Sie uns an dieser Stelle zuerst zurückblicken und uns in Erinnerung rufen, wie wir Objekte im Resource-Abschnitt eines Elements definieren:
<Window.Resources>
<local:Person x:Key="pers" Name="Meier" />
</Window.Resources>
Listing 25.9 Ein CLR-Objekt im XAML-Code erstellen
Dazu ist es notwendig, zuerst den Namespace und möglicherweise die Assemblierung als XML-Namespace-Angabe bekannt zu geben. Unter Voranstellung des Namespace-Präfixes erstellen Sie ein Objekt (in Listing 25.9 vom Typ Person) und können dem Objekt sofort Daten mit auf den Lebensweg geben. Diese Form der Instanziierung verwendet den parameterlosen Konstruktor.
Die Klasse ObjectDataProvider gestattet ebenfalls Objekte im XAML-Code zu erstellen. Aber die Möglichkeiten dieser Klasse gehen über die angesprochene Instanziierung hinaus, denn mit dieser Klasse können Sie auch parametrisierte Konstruktoren und sogar Methoden des Objekts aufrufen. Letzteres gestattet es, Methoden aufzurufen, die als Rückgabewert eine Liste von Elementen liefern.
Die Klasse, an der wir ObjectDataProvider testen wollen, soll wieder Person sein. Sie ist mit der Methode DoSomething ausgestattet, die im Grunde genommen nichts mit einer Person zu tun hat. Sie dient nur zu Testzwecken.
class Person {
public string Name {get;set;}
public Person() { }
public Person(string name) {
Name = name;
}
public string DoSomething(int value){
return Math.Pow(value, 2).ToString();
}
}
Listing 25.10 Die Vorgabe der Klasse »Person«
Im weiteren Verlauf des Beispiels werden wir zwei Namespaces benutzen, die wir zuerst bekannt geben und mit einem Präfix versehen:
xmlns:local="clr-namespace:ObjectDataProviderSample"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Listing 25.11 Bekanntgabe der notwendigen XML-Namespaces
Aufruf eines parametrisierten Konstruktors
Widmen wir uns zunächst dem ObjectDataProvider, mit dem wir den parametrisierten Konstruktor von Person aufrufen:
<ObjectDataProvider x:Key="pers1" ObjectType="{x:Type local:Person}">
<ObjectDataProvider.ConstructorParameters>
<sys:String>Manfred Fischer</sys:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
Listing 25.12 Aufruf des parametrisierten Konstruktors
Dem ObjectDataProvider-Objekt teilen wir mit der Eigenschaft ObjectType mit, von welchem Typ das von uns angeforderte Objekt ist. Über die Eigenschaft ConstructorParameters übergeben wir dem parametrisierten Konstruktor das erforderliche Argument. Eingefasst wird das Übergabeargument in ein datentypbeschreibendes Element. Um uns vom Erfolg des Konstruktoraufrufs zu überzeugen, reicht ein einfaches TextBlock-Element:
<TextBlock Text="{Binding Source={StaticResource pers1}, Path=Name}" />
Listing 25.13 Bindung an das durch einen parametrisierten Konstruktor erstellte Objekt
Objektmethode aufrufen
Sehr ähnlich, wie wir einen parametrisierten Konstruktor ansprechen, rufen wir auch eine Methode auf. Hierzu stellt uns das ObjectDataProvider-Objekt mit MethodName eine Eigenschaft zur Verfügung, der wir die aufzurufende Methode übergeben. Definiert die aufzurufende Methode darüber hinaus auch noch Parameter, werden diese der Eigenschaft MethodParameters bekannt gegeben. Mit der Eigenschaft ObjectInstance des ObjectDataProvider-Elements können wir auf das bereits zuvor erstellte Person-Objekt pers1 zugreifen.
<ObjectDataProvider x:Key="pers2"
ObjectInstance="{StaticResource pers1}"
MethodName="DoSomething">
<ObjectDataProvider.MethodParameters>
<sys:Int32>12</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Listing 25.14 Methodenaufruf im XAML-Code definieren
Um die Eigenschaft eines Steuerelements an den Rückgabewert der Methode zu binden, erstellen wir ein Binding-Objekt und teilen diesem in seiner Eigenschaft Source mit, dass auf eine Ressource statisch zugegriffen werden soll. Die Bindung sehen Sie im folgenden Listing.
<TextBlock Text="{Binding Source={StaticResource pers2}}" />
Listing 25.15 Binden an die Methode eines »ObjectDataProvider«-Objekts
Würde der Rückgabewert der Methode eine Menge sein, müsste man natürlich an die Eigenschaft DataContext oder ItemsSource eines entsprechenden ItemsControls binden.
Bindung an eine statische Methode
Ganz einfach gestaltet sich auch der Zugriff auf eine statische Methode. Sie brauchen dazu nur keinen Konstruktor aufzurufen.
<ObjectDataProvider x:Key="pers3"
ObjectType="{x:Type local:Person}"
MethodName="DoSomething2">
<ObjectDataProvider.MethodParameters>
<sys:Int32>17</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Listing 25.16 Aufruf einer statischen Methode
Sie finden das komplette Beispiel auf der Buch-DVD unter Beispiele\Kapitel 25\ObjectDataProviderSample.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.