{"id":55000070,"date":"2016-12-01T00:00:00","date_gmt":"2020-03-27T19:24:22","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=70"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"PropertyChanged_in_der_Praxis","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/PropertyChanged_in_der_Praxis\/","title":{"rendered":"PropertyChanged in der Praxis"},"content":{"rendered":"<p><b>Der Artikel &#8220;Basics: PropertyChanged&#8221; zeigt, wie die Schnittstelle INotifyPropertyChanged funktioniert. In unserer Beispielanwendung Bestellverwaltung verwenden wir diese Schnittstelle an einer Stelle, wo wir einen Ribbon-Button in Abh&auml;ngigkeit vom Wert einer Eigenschaft aktivieren und deaktivieren, die das PropertyChanged-Ereignis ausl&ouml;st. Im vorliegenden Artikel zeigen wir, wie dies im Detail funktioniert.<\/b><\/p>\n<h2>Hintergrund<\/h2>\n<p>Unter Access war es &uuml;blich, den Zustand von Steuerelementen direkt per Code durch &Auml;ndern der entsprechenden Eigenschaft zu &auml;ndern. Das ist nat&uuml;rlich auch unter WPF\/C# m&ouml;glich. Allerdings geh&ouml;rt es dort zum guten Ton, die Definition der Benutzeroberfl&auml;che mit XAML und die Anwendungslogik in C#-Klassen voneinander zu trennen, und zwar in der Form, dass der Zustand der Benutzeroberfl&auml;che entweder direkt in XAML definiert wird oder aber durch die Bindung an Elemente der Anwendungslogik ermittelt wird. Keinesfalls jedoch sollten die Elemente der Anwendungslogik auf jene der Benutzeroberfl&auml;che zugreifen. Nun wollen wir in unserem Beispiel eine Schaltfl&auml;che im Ribbon, mit der man einen in einer Liste markierten Eintrag l&ouml;schen kann, nur aktivieren, wenn die Liste auch im unteren Bereich des Fensters angezeigt wird. Ist das nicht der Fall, weil beispielsweise gerade die Details eines Kundendatensatzes dort abgebildet werden, soll die Schaltfl&auml;che deaktiviert sein. Unter Access h&auml;tte man nun ein Ereignis, das beim Einblenden der Kundenliste ausgel&ouml;st wird, genutzt, um die Schaltfl&auml;che zum L&ouml;schen eines Listeneintrags zu aktivieren oder zu deaktivieren.  <\/p>\n<p>Hier wollen wir nun aber moderner vorgehen und Benutzeroberfl&auml;che und Anwendungslogik so weit wie m&ouml;glich voneinander trennen. Dazu legen wir im Code behind-Modul eine &ouml;ffentliche Eigenschaft an, an die wir das <b>IsEnabled<\/b>-Attribut der betroffenen Ribbon-Schaltfl&auml;che binden. Den Wert dieser Eigenschaft stellen wir an einer geeigneten Stelle ein, in diesem Fall dem Ereignis <b>Navigated <\/b>des <b>Frame<\/b>-Objekts namens <b>Workzone<\/b>, das unsere verschiedenen <b>Page<\/b>-Objekte wie die Kundendetails oder die Kundenliste einblendet.<\/p>\n<h2>Umsetzung<\/h2>\n<p>F&uuml;r die Umsetzung deklarieren wir zun&auml;chst eine <b>Boolean<\/b>-Variable namens <b>kundeLoeschbar<\/b>:<\/p>\n<pre>bool kundeLoeschbar;<\/pre>\n<p>F&uuml;r diese legen wir eine &ouml;ffentliche Eigenschaft namens <b>KundeLoeschbar <\/b>an und statten diese mit dem &uuml;blichen Getter und Setter aus. Dem Setter f&uuml;gen wir gleich noch den Aufruf der Methode <b>OnPropertyChanged <\/b>hinzu und &uuml;bergeben dieser mit einem neuen Objekt des Typs <b>PropertyChangedEventArgs <\/b>den Namen der Eigenschaft:<\/p>\n<pre>public bool KundeLoeschbar {\r\n     get { return kundeLoeschbar; }\r\n     set { \r\n         kundeLoeschbar = value;\r\n         OnPropertyChanged(new PropertyChangedEventArgs(\"KundeLoeschbar\"));\r\n     }\r\n}<\/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\/55000070\/\">\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\/55000070?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\/55000070\/\"\/>\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>Der Artikel &#8220;Basics: PropertyChanged&#8221; zeigt, wie die Schnittstelle INotifyPropertyChanged funktioniert. In unserer Beispielanwendung Bestellverwaltung verwenden wir diese Schnittstelle an einer Stelle, wo wir einen Ribbon-Button in Abh&auml;ngigkeit vom Wert einer Eigenschaft aktivieren und deaktivieren, die das PropertyChanged-Ereignis ausl&ouml;st. Im vorliegenden Artikel zeigen wir, wie dies im Detail funktioniert.<\/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,44000029,44000002,44000035,44000004],"tags":[],"yst_prominent_words":[],"class_list":["post-55000070","post","type-post","status-publish","format-standard","hentry","category-662016","category-66062016","category-Access_programmieren","category-Benutzeroberflaeche_mit_WPF","category-COMDLLs_programmieren","category-Loesungen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000070","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=55000070"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000070\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000070"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}