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
Hallo Taladan,
dafür gibt es einen sog. DataContext in WPF.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Der wird schon anderweitig verwendet.
Auch ein Text="{Binding Path=Zaehler, RelativeSource={RelativeSource Self}}" Funktioniert nicht.
Gruß dat Tala
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
Weil ich das DataContext schon auf ein anderes Objekt festgelgt habe, das u.a. Aussehen der Textbox festlegt.
Gruß dat Tala
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
Aber das DataContext erlaubt doch nur ein Object als Quelle. Und mit MVVMPatterns habe ich mich nie beschäftigt.
Gruß dat Tala
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
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
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.