ich hab wiedermal ein kniffliges Problem. Und zwar portieren wir ein
Application Framework aus einer anderen tollen Sprache (ich nenne Sie jetzt
nicht beim JNamen) nach C#. Dabei geht werden unteranderem generische
Eingabeformulare erzeugt etc. Dabei ist reicht wohl die Funktionalität von
den WPF Controls und dem Binding nicht voll aus, um unsere Bedürfnisse zu
befriedigen.
Nach langem Üben und googeln habe ich ehrausgefunden, wie ich das Binding
erweitern kann. Wobei das wahrscheinlich auch nicht ganz ausreicht. Aber hier
kann mir sicher jemand Antworten auf meine essenziellen Fragen geben, die
mich davon abhalten, heute früher Schluss zu machen und das Wochenende zu
geniessen. Und zwar frage ich mich, wo das Transportieren der Daten passiert.
Also vom Control in meine Klasse und wieder zurück. Im Binding ist ja nur
definiert, wie das geschehen soll. Und dann was noch fast wichtiger ist.
Komme ich irgendwie vom Control ans Binding oder umgekehrt. Die Methode
SetBinding kann man ja leider nicht überschreiben. Mir fehlt etwas der Link,
zwischen diesen beiden Objekten. Die Source ist ja im Binding drin.
Bei Antworten wäre mir sicher sehr geholfen.
Besten Dank,
Michel
> Dabei ist reicht wohl die Funktionalität von den WPF
> Controls und dem Binding nicht voll aus,
> um unsere Bedürfnisse zu befriedigen.
> Nach langem Üben und googeln habe ich ehrausgefunden,
> wie ich das Binding erweitern kann.
gut, das ist jetzt aber etwas ungenau. Vielleicht wäre es
besser, wenn Du exakt ein Beispiel herausgreifst,
was Du gerne implementiert haben möchtest/musst.
Hast Du denn auch wirklich schon alle Konzepte
des WPF DataBindings durchdrungen? Ich gebe
Dir noch mal ein paar zentrale Anlaufstellen:
[Übersicht über Datenbindung]
http://msdn.microsoft.com/de-de/library/ms752347.aspx
[Windows Presentation Foundation Datenbindung]
http://msdn.microsoft.com/de-de/library/ms750612.aspx
[MSDN Webcast-Finder]
http://www.microsoft.com/germany/msdn/webcasts/finder/default.mspx?q=WPF
[WPF-Datenbindung mit LINQ to XML]
http://msdn.microsoft.com/de-de/library/bb669133.aspx
[C# Samples for Visual Studio 2008 - Home]
http://code.msdn.microsoft.com/csharpsamples/
(und dort: LinqSamples/LinqToXmlDataBinding)
___________________
> Und zwar frage ich mich, wo das Transportieren der
> Daten passiert. Also vom Control in meine Klasse
> und wieder zurück.
Im Prinzip bräuchtest Du erst die DependencyProperty
des Objektes, um deren Binding zu erfahren.
Vielleicht meinst Du also soetwas (mit dem Quellcode
aus o.a. LinqToXmlDataBinding Sample) :
BindingExpression be = videoListBox1.
GetBindingExpression(ListBox.ItemsSourceProperty);
oder ggf. mehrere:
videoListBox1.BindingGroup.BindingExpressions
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
vielen Dank für die Links, die haben mir schon etwas weiter geholfen. Aber
leider noch nicht ganz, deshalb hier mal meinen ganzen Kontext:
Also, ich bin daran, ein Applikationframework zu bauen, dazu möchte ich
folgendes Verhalten generisch implementieren.
Ich habe ein Control, z.B. ein TextBlock, daran möchte ich eine Klasse
binden, nehmen wir mal Person. Bis hier ist noch einfach.
Zusätzlich habe ich ein Modul, dass mir zu meiner Person gewisse Metadaten
liefert. Das sind unter anderem alle Eigenschaften, ob die Eigenschaften
Readonly sind, ob ein eingelogter Benutzer die Rechte hat, diese Eigenschaft
zu modifizieren.
Was ich jetzt möchte, ist WPF mit diesen Metadaten zu verbinden, resp. damit
Arbeiten zu lassen. Dazu habe ich als erstes mal TextBox abgeleitet.
(OTextBox).
Nun wenn der DataKontext der OTextBox-Instanz ändert, hole ich mir die
Metadaten des DataKontext, das Binding auf das TextProperty, dadurch erfahre
ich, welche Eigenschaft meiner Person angezeigt wird. Ich Lade die Metadaten
von Person. Anhand des Binding finde ich heraus, welche Eigenschaft angezeigt
wird. Ist das Feld Readonly, setze ich IsEnabled auf false, damit man nicht
eingeben kann. Das funktioniert soweit ganz gut.
(Was jetzt kommt, habe ich noch nicht ausprobiert, deshalb eher etwas
Spekulation)
Wenn der Benutzer nicht die Rechte hat, um die Eigenschaft anzusehen (z. B.
den Lohn einer Person) entferne ich das Binding und setze IsEnabled auf
false. Somit sieht man den Lohn nicht.
Ich denke, das würde auch noch funktionieren. Logt sich der Benutzer um und
hat dann die Rechte, mache ich das ganze wieder rückgängig.
Was ich aber gar nicht sehe, wie das gehen soll ist folgendes. Da es sich um
ein Framework handelt, hat derjenige, der das ganze dann verwendet alle
Möglichkeiten offen. Ich will den ja auch nicht einschränken. Es könnte also
auch sein, es wird das Panel angezeigt, eine OTextBox mit dem Path auf "Name"
(nehmen wir immernoch die Person als Beispiel) wird angezeigt und als
DataContext ist eine Instanz von Person gesetzt. Das Verhalten des Feldes
ist, wie oben beschrieben. Jetzt könnte der Programmierer im Code irgendwo
das Binding ändern oder verändern. Das gleiche Feld zeigt jetzt nicht mehr
den Namen an, sondern den Vornamen, dann soll sich OTextBox natürlich
anpassen, wenn nötig.
Dafür sehe ich aber keine Möglichkeit?! Gibt es dafür irgendein Event, das
ich noch nicht gefunden habe?
Besten Dank für Deine Hilfe,
Michel