{"id":55000064,"date":"2016-12-01T00:00:00","date_gmt":"2020-03-27T19:23:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=64"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Basics_PropertyChanged","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Basics_PropertyChanged\/","title":{"rendered":"Basics: PropertyChanged"},"content":{"rendered":"<p><b>Unter Access\/VBA haben Sie Tabellen direkt an Formulare und Steuerelemente gebunden, &Auml;nderungen an den Daten wurden regelm&auml;&szlig;ig auch im Frontend aktualisiert. Unter C#\/WPF sieht das ganz anders aus: Hier landen die Daten aus der Tabelle erstmal in Objekten und deren Eigenschaften werden mit Steuerelementen wie TextBox, ComboBox und so weiter angezeigt. Damit sich eine &Auml;nderung am zugrunde liegenden Objekt auch in der Benutzeroberfl&auml;che manifestiert, sind ein paar zus&auml;tzliche Handgriffe n&ouml;tig.<\/b><\/p>\n<h2>Beispiel: Einfache Kundenklasse<\/h2>\n<p>Um uns diese Handgriffe anzusehen, entwerfen wir ein ganz einfaches Beispiel. In diesem legen Sie in einem neuen, leeren Projekt des Typs <b>Visual C#|WPF-Anwendung <\/b>namens <b>PropertyChanged <\/b>eine neue Klasse namens <b>Kunde.cs <\/b>an und f&uuml;llen das dortige <b>Namespace<\/b>-Element <b>PropertyChanged <\/b>wie folgt:<\/p>\n<pre>public class Kunde {\r\n     string vorname;\r\n     string nachname;\r\n     public string Vorname {\r\n         get { return vorname; }\r\n         set { vorname = value; }\r\n     }\r\n     public string Nachname {\r\n         get { return nachname; }\r\n         set { nachname = value; }\r\n     }\r\n}<\/pre>\n<p>Dem Grid des Fensters <b>MainWindow.xaml <\/b>f&uuml;gen wir in zwei Spalten und drei Zeilen einige Elemente hinzu, die wie folgt definiert werden und die im Entwurf wie in Bild 1 aussehen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_64_001.png\" alt=\"Beispielfenster\" width=\"419,715\" height=\"254,0675\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispielfenster<\/span><\/b><\/p>\n<pre>&lt;Grid&gt;\r\n     --- Grid-Definition ...\r\n     &lt;Label Content=\"Vorname:\" Grid.Row=\"1\" Margin=\"5\"&gt;&lt;\/Label&gt;\r\n     &lt;TextBox Text=\"{Binding kunde.Vorname}\" Margin=\"5\" Grid.Row=\"1\" Grid.Column=\"1\"&gt;&lt;\/TextBox&gt;\r\n     &lt;Label Content=\"Nachname:\" Grid.Row=\"0\" Margin=\"5\"&gt;&lt;\/Label&gt;\r\n     &lt;TextBox Text=\"{Binding kunde.Nachname}\"  Grid.Row=\"0\" Grid.Column=\"1\" Margin=\"5\"&gt;&lt;\/TextBox&gt;\r\n     &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\" Grid.ColumnSpan=\"2\"&gt;\r\n         &lt;Button x:Name=\"btnNachnameAendern\" Margin=\"5\" Content=\"Nachname &auml;ndern\" Click=\"btnNachnameAendern_Click\"&gt;&lt;\/Button&gt;\r\n         &lt;Button x:Name=\"btnVornameAendern\" Margin=\"5\" Content=\"Vorname &auml;ndern\" Click=\"btnVornameAendern_Click\"&gt;&lt;\/Button&gt;\r\n     &lt;\/StackPanel&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p>Die beiden <b>TextBox<\/b>-Elemente sind jeweils &uuml;ber das Attribut <b>Text <\/b>an die Eigenschaften <b>kunde.Vorname <\/b>und <b>kunde.Nachname <\/b>gebunden. Das Objekt <b>kunde <\/b>des Typs <b>Kunde <\/b>enth&auml;lt, wie aus der Klassendefinition oben ersichtlich, die beiden Eigenschaften <b>Vorname <\/b>und <b>Nachname <\/b>und wird beim Erstellen des Fensters <b>MainWindows <\/b>erzeugt. Daf&uuml;r sorgt die Konstruktor-Methode <b>MainWindow()<\/b>, die beim Erstellen des Objekts ausgel&ouml;st wird. Die Klasse enth&auml;lt au&szlig;erdem noch eine &ouml;ffentliche Variable des Typs <b>Kunde <\/b>namens <b>kunde<\/b>, die in der Konstruktor-Methode gef&uuml;llt wird:<\/p>\n<pre>\/\/Code der Klasse MainWindow.xaml.cs\r\npublic partial class MainWindow : Window {\r\n     public Kunde kunde { get; set; }           \/\/&ouml;ffentliche Variable f&uuml;r das anzuzeigende Kunde-Objekt\r\n     public MainWindow() {                      \/\/Konstruktor-Methode\r\n         InitializeComponent();                 \/\/Initialisiert das Fenster auf Basis des .xaml-Codes\r\n         kunde = new Kunde();                   \/\/Erstellt ein neues Kunde-Objekt\r\n         kunde.Vorname = \"Andr&eacute;\";               \/\/F&uuml;llt die Eigenschaft Vorname\r\n         kunde.Nachname = \"Minhorst\";           \/\/F&uuml;llt die Eigenschaft Nachname\r\n         DataContext = this;                    \/\/Weist die Klasse als Datenquelle f&uuml;r das Fenster zu\r\n     }\r\n... \r\n}<\/pre>\n<p>Dadurch, dass <b>DataContext <\/b>auf <b>this <\/b>eingestellt ist, k&ouml;nnen wir im XAML-Code auf alle &ouml;ffentlichen Elemente dieser Klasse zugreifen. Nach dem Starten sieht die Anwendung nun wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_64_002.png\" alt=\"Fenster mit gef&uuml;llten Steuerelementen\" width=\"299,7964\" height=\"186,0473\"\/><\/p>\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\/55000064\/\">\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\/55000064?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\/55000064\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"22c77db969\"\/>\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>Unter Access\/VBA haben Sie Tabellen direkt an Formulare und Steuerelemente gebunden, &Auml;nderungen an den Daten wurden regelm&auml;&szlig;ig auch im Frontend aktualisiert. Unter C#\/WPF sieht das ganz anders aus: Hier landen die Daten aus der Tabelle erstmal in Objekten und deren Eigenschaften werden mit Steuerelementen wie TextBox, ComboBox und so weiter angezeigt. Damit sich eine &Auml;nderungen am zugrunde liegenden Objekte auch in der Benutzeroberfl&auml;che manifestiert, sind ein paar zus&auml;tzliche Handgriffe n&ouml;tig.<\/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":[662016,66062016,44000001,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000064","post","type-post","status-publish","format-standard","hentry","category-662016","category-66062016","category-CGrundlagen","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000064","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=55000064"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000064\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000064"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}