Laden...

DataBinding auf eigenen CodeBehind

Erstellt von Taladan vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.072 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren
DataBinding auf eigenen CodeBehind

Aloha,

Ich habe im CodeBedind meiner Page ein Eigenschaft definiert. Dieses ist eigendlich nichts weiter als ein Zähler. Nun würde ich gerne in meiner Page genau auf diese Eigenschaft binden. Am liebsten über WPF. Ich dachte eigenlich ein einfafaches

<TextBlock Text="{Binding Path=Zaehler}" />

würde ausreichen. Jedoch habe ich keinen erfolg 😦.

Gruß dat Tala

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo Taladan,

dafür gibt es einen sog. DataContext in WPF.

zero_x

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Der wird schon anderweitig verwendet.

Auch ein Text="{Binding Path=Zaehler, RelativeSource={RelativeSource Self}}" Funktioniert nicht.

Gruß dat Tala

328 Beiträge seit 2006
vor 14 Jahren

ich verstehe nicht was dich daran hindert, im Konstruktors des CodeBehinds folgendes zu schreiben:

DataContext = this;

?

MfG TripleX

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Weil ich das DataContext schon auf ein anderes Objekt festgelgt habe, das u.a. Aussehen der Textbox festlegt.

Gruß dat Tala

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo Taladan,

Weil ich das DataContext schon auf ein anderes Objekt festgelgt habe, das u.a. Aussehen der Textbox festlegt.

Sollte normalerweise kein problem sein sofern du deine Anwendung mit dem MVVM Pattern aufbaust.

Falls das nicht der Fall ist dann sag ich dir mal ne Lösung, ist zwar nicht so schön, aber naja 😃
Du musst deinem Window (im Xaml Code einen namen geben x:Name="abc"),
dann kannst du von deinem Control aus auf ElementName=abc, Path=meinProperty binden

Aber wie schon erwähnt sollte man das mit dem DataContext machen

Gruss
Michael

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Aber das DataContext erlaubt doch nur ein Object als Quelle. Und mit MVVMPatterns habe ich mich nie beschäftigt.

Gruß dat Tala

328 Beiträge seit 2006
vor 14 Jahren

das u.a. Aussehen der Textbox festlegt.

Dafür gibt es in WPF doch styles

Aber das DataContext erlaubt doch nur ein Object als Quelle

Er meinte das anders, und zwar gib der TextBox einen Namen (z.B. txtInput), dann kannst du im code behind darauf zugreifen mittels txtInput.Text = "Hello World". Oder um eine Datenbindung im CodeBehind zu erstellen, kannst du dann acuh folgendes machen:

Binding binding = new Binding();
binding.Source = Zaehler;
txtInput.SetBinding(TextBlock.TextProperty, binding);

Und mit MVVMPatterns habe ich mich nie beschäftigt.

Solltest du mal tun, ist en ganz nettes Pattern für WPF-Anwendungen

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

1.044 Beiträge seit 2008
vor 14 Jahren

Hallo Taladan,

du hast von uns Ratschläge und Hinweise bekommen. Meine Antwort sollte dein Problem lösen, was du allerdings nicht verstehen möchtest. Dies ist auch m.E. die einzigste Möglichkeit.

zero_x

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Hallo Zero_X, ich weiß jetzt nicht, warum du dich auf den Schlips getreten fühlst. Natürlich verstehe ich deine Aussage und ich verwende es schon seit Jahren! so, da dies zu den Grundbegriffen gehört. Zudem man auch verstehen muß, das es häufig mehr als einen Weg zum ziel gibt.
Der Lösungsvorschlag von MichlG hat mich so auf eine Idee gebracht. Ich verwende nun ein unsichtbares Element und lese von dort den Wert aus.
Das Objekt an den die TextBox gebunden ist, sorgt nicht nur für die Optik sondern auch noch für Position, spezielle Nutzereingabenevent und vieles mehr (da es eine Spezielle Textbox ist, die eine Art Kalender zu grunde legt, der nicht auf TTMMJJ basiert sodern auf 12 Numerische und Alphanumerische werte mit einer komplexen (glücklicherweise nicht von mir entwickelten) Verschachtelung der Werte arbeitet. Der Nutzen? Keine Ahnung. Die Aufgabe war einfach so gestellt worden. Also nutze ich sie.

Gruß dat Tala

U
1.578 Beiträge seit 2009
vor 14 Jahren

Mach doch das Objekt was du in den DataContext sitzt als ein Feld in der Klasse, dann kannst du die Klasse als DataContext zum Binding setzen.

Wie benutzt du den DataContext bisher?
Ich vermute du hast sowas:
<Controls:MyAdvanceTextBlock Position="{Binding Pos}" Size="{Binding Size}" />
und im Code machst du sowas
DataContext = new MyAdvanceSettings(...);

Das kannst du ändern:

DataContext = this;
public MyAdvanceSettings Cfg { get; set; }

<Controls:MyAdvanceTextBlock Position="{Binding Cfg.Pos}" Size="{Binding Cfg.Size}" />

Dann hast du den DataContext wirklich frei auf dem richtigen Weg.

Was du auch machen kannst ist das du nicht den DataContext des Fensters setzt, sondern des Controls:

<Controls:MyAdvanceTextBlock x:Name="cfg" Position="{Binding Pos}" Size="{Binding Size}" />

cfg.DataContext = new MyAdvanceSettings(...);

auch dann hast du den DataContext des Fensters noch frei, kannst es auf this setzen und alles nach Belieben binden.

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 14 Jahren

Hey gute Idee 😃. Werde ich gleich mal umbauen

Gruß dat Tala