21.6 Die Klasse »ObjectDataProvider« 

Fassen wir an dieser Stelle kurz zusammen, wie wir Objekte im Resource-Abschnitt eines Elements definieren:
<Window.Resources> <local:Person x:Key="pers" Name="Meier" /> </Window.Resources>
Sie geben die Klasse unter Voranstellung des Namespace an und geben dem Objekt sofort Daten mit auf den Lebensweg. Diese Form der Instanziierung verwendet den parameterlosen Konstruktor.
Die Klasse ObjectDataProvider gestattet es 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 Parameter an den Konstruktor übergeben und sogar Methoden des Objekts aufrufen.
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. Aber für unsere Testzwecke …
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(); } }
Im weiteren Verlauf des Beispiels werden wir zwei Namespaces benutzen, die wir zuerst bekannt geben:
xmlns:local="clr-namespace:ObjectDataProviderSample" xmlns:sys="clr-namespace:System;assembly=mscorlib"
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>Conie Serna</sys:String> </ObjectDataProvider.ConstructorParameters> </ObjectDataProvider>
Dem ObjectDateProvider-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 Element, das den Datentyp beschreibt.
Um uns vom Erfolg des Konstruktoraufrufs zu überzeugen, reicht ein einfaches TextBlock-Element:
<TextBlock Text="{Binding Source={StaticResource pers1}, Path=Name}" />
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.
<ObjectDataProvider x:Key="pers2" ObjectType="{x:Type local:Person}" MethodName="DoSomething"> <ObjectDataProvider.MethodParameters> <sys:Int32>12</sys:Int32> </ObjectDataProvider.MethodParameters> </ObjectDataProvider>
Der XAML-Code zum Testen des Methodenaufrufs bedarf keiner weiteren Erläuterung.
<TextBlock Text="{Binding Source={StaticResource pers2}}" />
Hinweis |
Sie finden das komplette Beispiel auf der Buch-DVD unter Beispiele\Kapitel 21\ObjectDataProvider. |