{"id":55000196,"date":"2019-12-01T00:00:00","date_gmt":"2020-03-27T19:39:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=196"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Steuerelemente_an_Daten_binden_Textfelder","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Steuerelemente_an_Daten_binden_Textfelder\/","title":{"rendered":"Steuerelemente an Daten binden: Textfelder"},"content":{"rendered":"<p><b>Eines der Hauptkonzepte von WPF ist es, dass Steuer-elemente &uuml;ber entsprechende Bindungsattribute an die Datenquellen gebunden werden. Es gibt verschiedene Datenquellen: einfache Eigenschaften, Objekte oder Auflistungen. In dieser Artikelreihe schauen wir uns an, wie Sie die g&auml;ngigsten Steuer-elemente an verschiedene Datenquellen binden und welche Attribute dazu ben&ouml;tigt werden. Den Beginn macht das Textbox-Steuerelement.<\/b><\/p>\n<h2>Binden statt zuweisen<\/h2>\n<p>Die WPF-Philosophie setzt im Gegensatz etwa zu den Formularen unter Access verst&auml;rkt auf die Datenbindung und weniger darauf, dass Steuer-elemente per Code auf bestimmte Datenquellen oder Werte eingestellt werden. Wir schauen uns den Unterschied in einem ersten Beispiel an.<\/p>\n<h2>Zuweisen von Werten per VB<\/h2>\n<p>Hier experimentieren wir einfach nur mit Textfeldern f&uuml;r die drei Eigenschaften <b>Vorname<\/b>, <b>Nachname <\/b>und <b>Ort<\/b>. Das Fenster, in dem wir diese Beispiele darstellen, hei&szlig;t <b>BindenAnEigenschaft<\/b> und enth&auml;lt in einem Grid neben zwei Bezeichnungsfeldern jeweils ein Textfeld und eine Schaltfl&auml;che pro Zeile (siehe Bild 1). Das erste Textfeld namens <b>txtVorname <\/b>soll beim &Ouml;ffnen des Fensters per Code in der Code behind-Klasse mit einem Wert gef&uuml;llt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_196_001.png\" alt=\"Beispiel f&uuml;r mit Daten gef&uuml;llte Textfelder im Entwurf\" width=\"700\" height=\"152,2103\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r mit Daten gef&uuml;llte Textfelder im Entwurf<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che soll den Wert des Textfeldes dann ebenfalls durch Zuweisung per VB &auml;ndern. Das erledigen wir, indem wir dem Fenster die folgende Konstruktor-Methode zuweisen, die beim Erstellen des Fensters ausgel&ouml;st wird. Der Befehl <b>InitializeComponent <\/b>sorgt daf&uuml;r, dass das Fenster auf Basis der XAML-Definition des Fensters erstellt wird und die zweite Anweisung weist der Eigenschaft <b>Text <\/b>des Textfeldes <b>txtVorname <\/b>den Wert <b>Andr&eacute; <\/b>zu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     InitializeComponent()\r\n     txtVorname.Text = \"Andr&eacute;\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das sorgt daf&uuml;r, dass das Textfeld direkt nach dem &Ouml;ffnen den gew&uuml;nschten Wert anzeigt. Neben dem Textfeld befindet sich die Schaltfl&auml;che <b>cmdNameAendern<\/b>. F&uuml;r dieses hinterlegen wir die folgende Ereignismethode:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNameAendern_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     txtVorname.Text = \"Michael\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Methode wird durch einen Klick auf die Schaltfl&auml;che ausgel&ouml;st. Sie weist der Eigenschaft <b>Text <\/b>den Wert <b>Michael <\/b>zu. Diese Art der Anzeige von Daten in Steuerelementen soll unter WPF optimalerweise nicht praktiziert werden.<\/p>\n<h2>Bindung an eine Eigenschaft der Code behind-Klasse<\/h2>\n<p>Beim zweiten Textfeld <b>txtNachname <\/b>verwenden wir den Ansatz der Bindung vom WPF-Steuerelement aus. Dazu hinterlegen wir im Code behind-Modul des Fensters eine &ouml;ffentliche Eigenschaft namens <b>Nachname<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>Nachname<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Dieser Eigenschaft weisen wir in der Konstruktor-Methode <b>New <\/b>einen Wert zu. Au&szlig;erdem stellen wir f&uuml;r die Eigenschaft <b>DataContext <\/b>den Wert <b>Me <\/b>ein. Damit legen wir fest, dass die aktuelle Klasse als Datenquelle f&uuml;r das WPF-Fenster verwendet werden soll:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     InitializeComponent()\r\n     DataContext = Me\r\n     Nachname = \"Minhorst\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Somit k&ouml;nnen wir in den Steuerelementen im WPF-Fenster auf die &ouml;ffentlich deklarierten Eigenschaften des Code behind-Moduls zugreifen, zum Beispiel auf die Eigenschaft <b>Nachname<\/b>. Das zweite Textfeld <b>txtNachname <\/b>wollen wir auf diese Weise mit dem Wert f&uuml;llen, den wir in der <b>New<\/b>-Methode der Eigenschaft <b>Nachname <\/b>zugewiesen haben.<\/p>\n<p>Die XAML-Definition des Textfeldes statten wir dazu mit dem Wert <b>{Binding Nachname} <\/b>f&uuml;r das Attribut <b>Text <\/b>aus:<\/p>\n<pre>&lt;TextBox x:Name=\"txtNachname\" ... Text=\"{Binding Nachname}\"&gt;&lt;\/TextBox&gt;<\/pre>\n<p>Starten wir nun das Projekt, zeigt das Textfeld den im Konstruktor zur Eigenschaft <b>Nachname <\/b>zugewiesenen Wert <b>Minhorst <\/b>an. Die Schaltfl&auml;che <b>cmdNachnameAendernGebunden <\/b>soll den Wert im Textfeld &auml;ndern, indem es der Eigenschaft, an das dieses Textfeld gebunden ist, einen neuen Wert zuweist. Dazu programmieren wir seine Ereignismethode wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CmdNachnameAendernGebunden_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     Nachname = \"M&uuml;ller\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das hat aber beim Testen keinen Effekt &#8211; der Wert des Textfeldes &auml;ndert sich nicht. Der Grund ist einfach: Wir m&uuml;ssen bei der &Auml;nderung der Eigenschaft ein Ereignis ausl&ouml;sen, durch die das daran gebundene Steuer-element erf&auml;hrt, dass der Wert der Eigenschaft ge&auml;ndert wurde. Dazu nutzen wir die <b>INotifyPropertyChanged<\/b>-Schnittstelle. Wie diese genutzt wird, zeigen wir am dritten Textfeld <b>txtOrt <\/b>und der im Code behind-Modul definierten Eigenschaft <b>Ort<\/b>.<\/p>\n<h2>Textfeld bei Eigenschafts&auml;nderungen aktualisieren<\/h2>\n<p>Um die <b>IPropertyNotifyChanged<\/b>-Schnittstelle zu implementieren, sind folgende Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Hinzuf&uuml;gen eines Verweises auf den Namespace <b>System.ComponentModel<\/b><\/li>\n<li>Bekanntgeben der Implementierung mit dem <b>Implements<\/b>-Schl&uuml;sselwort<\/li>\n<li>Umsetzen der Implementierung per Schnellaktion und Hinzuf&uuml;gen einer weiteren Methode<\/li>\n<li>&Auml;ndern der Eigenschaft durch Erg&auml;nzen von Getter und Setter<\/li>\n<li>Hinzuf&uuml;gen des Aufrufs von <b>OnPropertyChanged <\/b>im Setter der Eigenschaft<\/li>\n<\/ul>\n<p>Im Code sieht das Ergebnis wie folgt aus. Im Kopf des Moduls platzieren wir den Verweis auf den <b>System.ComponentModel<\/b>-Namespace:<\/p>\n<pre>Imports System.ComponentModel<\/pre>\n<p>Die Implementierung der Schnittstelle geben wir durch das Implements-Schl&uuml;sselwort in einer neuen Zeile hinter der Klassenbezeichnung an:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> BindenAnEigenschaft\r\n     Implements INotifyPropertyChanged<\/pre>\n<p>Klicken Sie dann mit der rechten Maustaste auf <b>INotifyPropertyChanged <\/b>und w&auml;hlen Sie den Eintrag <b>Schnellaktionen und Refactorings&#8230; <\/b>aus dem nun erscheinenden Kontextmen&uuml; aus. Dies liefert ein Popup, mit dem Sie den Befehl <b>Schnittstelle implementieren <\/b>ausw&auml;hlen.<\/p>\n<p>Das erg&auml;nzt die folgende Zeile mit der Definition des Ereignisses <b>PropertyChanged<\/b>:<\/p>\n<pre>    <span style=\"color:blue;\">Public <\/span>Event PropertyChanged<span style=\"color:blue;\"> As <\/span>PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged<\/pre>\n<p>Wir f&uuml;gen dann diese Methode hinzu, um das enthaltene Ausl&ouml;sen des oben definierten Ereignisses nicht f&uuml;r jede Eigenschaft neu schreiben zu m&uuml;ssen:<\/p>\n<pre>     Protected Overridable Sub OnPropertyChanged(propname<span style=\"color:blue;\"> As String<\/span>)\r\n         RaiseEvent PropertyChanged(Me, <span style=\"color:blue;\">New<\/span> PropertyChangedEventArgs(propname))\r\n     End Sub<\/pre>\n<p>Stattdessen k&ouml;nnen wir einen vereinfachten Aufruf in den Setter der Eigenschaft schreiben. Den Setter erstellen wir nebst dem Getter, indem wir die Eigenschaft ebenfalls mit der rechten Maustaste anklicken und wieder den Befehl <b>Schnellaktionen und Refactorings&#8230; <\/b>aufrufen. Diesmal f&uuml;hren wir den Befehl <b>In vollst&auml;ndige Eigenschaft konvertieren <\/b>in dem danach angezeigten Popup aus und erzeugen aus der einfachen <b>Property<\/b>-Eigenschaft das folgende Konstrukt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>_Ort<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Public Property <\/span>Ort<span style=\"color:blue;\"> As String<\/span>\r\n     Get\r\n         Return _Ort\r\n     End Get\r\n     <span style=\"color:blue;\">Set<\/span>\r\n         _Ort = Value\r\n         OnPropertyChanged(\"Ort\")\r\n     End <span style=\"color:blue;\">Set<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Wir haben hier schon die entscheidende Anweisung hinzugef&uuml;gt, n&auml;mlich den Aufruf der Methode <b>OnPropertyChanged <\/b>f&uuml;r die als Parameter angegebene Eigenschaft <b>Ort<\/b>. Um zu pr&uuml;fen, ob der Inhalt des Textfeldes nun automatisch ge&auml;ndert wird, wenn wir den Wert der Eigenschaft anpassen, nutzen wir die durch die Schaltfl&auml;che <b>btnOrtGebunden <\/b>ausgel&ouml;ste Methode:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>BtnOrtGebunden_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     Ort = \"M&uuml;lheim\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000196\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000196?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000196\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"dbce743e9d\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eines der Hauptkonzepte von WPF ist es, dass Steuer-elemente &uuml;ber entsprechende Bindungsattribute an die Datenquellen gebunden werden. Es gibt verschiedene Datenquellen: einfache Eigenschaften, Objekte oder Auflistungen. In dieser Artikelreihe schauen wir uns an, wie Sie die g&auml;ngigsten Steuer-elemente an verschiedene Datenquellen binden und welche Attribute dazu ben&ouml;tigt werden. Den Beginn macht das Textbox-Steuerelement.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662019,66062019,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000196","post","type-post","status-publish","format-standard","hentry","category-662019","category-66062019","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000196"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000196\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000196"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}