{"id":55000063,"date":"2016-12-01T00:00:00","date_gmt":"2020-03-27T19:23:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=63"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Abhaengige_Eigenschaften_per_Binding","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Abhaengige_Eigenschaften_per_Binding\/","title":{"rendered":"Abh&auml;ngige Eigenschaften per Binding"},"content":{"rendered":"<p><b>Im Artikel Trigger haben Sie erfahren, dass Sie Eigenschaften von Elementen abh&auml;ngig von der &Auml;nderung anderer Eigenschaften ebenfalls &auml;ndern k&ouml;nnen. Dies gelingt, mitunter &uuml;ber kleine Umwege, auch mithilfe von Bindungen zwischen den Steuerelementen. So k&ouml;nnen Sie beispielsweise ganz einfach definieren, dass eine Eigenschaft den Wert True erh&auml;lt, wenn eine Eigenschaft eines anderen Elements auch diese Eigenschaft annimmt. Soll hingegen der Wert False &uuml;bernommen werden, wenn die andere Eigenschaft True lautet, wird es kompliziert &#8211; dann kommt ein Converter ins Spiel. Dieser Artikel zeigt die M&ouml;glichkeiten f&uuml;r den Ersatz von Triggern durch Binding auf.<\/b><\/p>\n<h2>Beispielprojekt<\/h2>\n<p>Wir verwenden hier wieder das Beispiel, das auch im Artikel <b>Trigger <\/b>zum Einsatz kam: Wir wollen also in Abh&auml;ngigkeit vom Zustand eines <b>CheckBox<\/b>-Elements drei Textfelder aktivieren\/deaktivieren. Der Aufbau der vier beteiligten Steuerelemente sieht, bevor wir die ben&ouml;tigten Bindungen hinzuf&uuml;gen, wie folgt aus (siehe Bild 1):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_63_001.png\" alt=\"Abh&auml;ngigkeit per Binding realisieren\" width=\"499,6607\" height=\"176,9836\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Abh&auml;ngigkeit per Binding realisieren<\/span><\/b><\/p>\n<pre>&lt;CheckBox x:Name=\"chkGeschaeftskunde\" Margin=\"5\" Grid.Column=\"1\" VerticalAlignment=\"Center\" \/&gt;\r\n&lt;TextBox x:Name=\"txtFirma\" Grid.Row=\"2\" Grid.Column=\"1\" Margin=\"5\" \/&gt;\r\n&lt;TextBox x:Name=\"txtVorname\" Grid.Row=\"3\" Grid.Column=\"1\" Margin=\"5\" \/&gt;\r\n&lt;TextBox x:Name=\"txtNachname\" Grid.Row=\"4\" Grid.Column=\"1\" Margin=\"5\" \/&gt;<\/pre>\n<h2>Binding f&uuml;r den gleichen Boolean-Wert<\/h2>\n<p>Ganz einfach ist die L&ouml;sung, wenn das &Auml;ndern einer Eigenschaft eines Elements eine Eigenschaft des anderen Elements mit dem gleichen Datentyp ausl&ouml;sen soll und die Werte der beiden Eigenschaften gleich sein sollen. Das ist bei uns der Fall, wenn wir das <b>CheckBox<\/b>-Element <b>chkGeschaeftskunde <\/b>und das <b>TextBox<\/b>-Element <b>txtFirma <\/b>betrachten: Wenn die Eigenschaft <b>Is-Checked <\/b>von <b>chkGesch&auml;ftskunde <\/b>den Wert <b>True <\/b>hat, soll auch die Eigenschaft <b>IsEnabled <\/b>von <b>txtFirma <\/b>den Wert <b>True <\/b>aufweisen und umgekehrt. Beide Attribute haben den Datentyp <b>Boolean<\/b>. In diesem Fall k&ouml;nnen wir den Wert der Eigenschaft <b>IsChecked <\/b>von <b>chkGeschaeftskunde <\/b>direkt per Binding der Eigenschaft <b>IsEnabled <\/b>von <b>txtFirma <\/b>zuweisen:<\/p>\n<pre>&lt;TextBox x:Name=\"txtFirma\" ... IsEnabled=\"{Binding ElementName=chkGeschaeftskunde, Path=IsChecked}\" \/&gt;<\/pre>\n<p>Wann immer der Benutzer nun das Kontrollk&auml;stchen mit einem Haken versieht, wird auch das Textfeld aktiviert.<\/p>\n<h2>Binding f&uuml;r negierte Boolean-Werte<\/h2>\n<p>Bei dem Kontrollk&auml;stchen und den beiden &uuml;brigen Textfeldern wird es etwas komplizierter: Wir wollen ja nicht den gleichen Wert zuweisen, sondern den negierten Wert &#8211; hat die Eigenschaft <b>IsChecked <\/b>von <b>chkGeschaeftskunde <\/b>den Wert <b>True<\/b>, soll <b>IsEnabled <\/b>von <b>txtVorname <\/b>und <b>txtNachname <\/b>den Wert <b>False <\/b>aufweisen und umgekehrt. In einem Binding k&ouml;nnen wir aber nicht einfach wie unter C# den Operator <b>Not <\/b>verwenden, um einen <b>Boolean<\/b>-Wert umzukehren. Hier ben&ouml;tigen wir einen Converter, der in Form einer eigenen Klasse mit zwei Methoden daherkommt.<\/p>\n<p>Ein Converter kann einfache Aufgaben &uuml;bernehmen wie etwa das Umwandeln von <b>True <\/b>in <b>False <\/b>und umgekehrt, aber auch komplexere Operationen durchf&uuml;hren. In diesem Fall wollen wir eine <b>Converter<\/b>-Klasse namens <b>BoolInvertConverter <\/b>erstellen, indem wir per <b>Strg + Umschalt + A <\/b>den Dialog <b>Neues Element hinzuf&uuml;gen <\/b>&ouml;ffnen, dort den Eintrag <b>Klasse <\/b>ausw&auml;hlen und den Namen <b>BoolInvertConverter.cs <\/b>angeben, bevor wir auf <b>Hinzuf&uuml;gen <\/b>klicken (siehe Bild 2). Nach dem Hinzuf&uuml;gen legen Sie in der Klasse noch einen Verweis auf einen Namespace an, der die gleich verwendete Schnittstelle <b>IValueConverter <\/b>nutzt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_63_002.png\" alt=\"Anlegen der Converter-Klasse \" width=\"649,559\" height=\"366,1\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen der Converter-Klasse <\/span><\/b><\/p>\n<pre>using System.Windows.Data;<\/pre>\n<p>F&uuml;r die Implentierung eines Converters gibt es bestimmte Regeln, die sich in Form einer Schnittstellendefinition niederschlagen. In der neu erstellten Klasse f&uuml;gen Sie nun also durch einen Doppelpunkt getrennt hinter dem Klassennamen die Schnittstelle <b>IValue-Converter <\/b>hinzu:<\/p>\n<pre>public class BoolInvertConverter : IValueConverter {\r\n}<\/pre>\n<p><b>IValueConverter <\/b>wird nun rot unterstrichen dargestellt, was daran liegt, dass wir die Member der Schnittstelle noch nicht implementiert haben. Das holen Sie am einfachsten nach, indem Sie mit der rechten Maustaste auf den Namen der Schnittstelle klicken, den Kontextmen&uuml;-Eintrag <b>Schnellaktionen und Refactorings&#8230; <\/b>ausw&auml;hlen und im nun erscheinenden Popup auf <b>Schnittstelle implementieren <\/b>klicken. Dies f&uuml;gt die folgenden beiden Methoden zur Klasse hinzu:<\/p>\n<pre>public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {\r\n     throw new NotImplementedException();\r\n}\r\npublic object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {\r\n     throw new NotImplementedException();\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\/55000063\/\">\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\/55000063?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\/55000063\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"3ff11b0f54\"\/>\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>Im Artikel Trigger haben Sie erfahren, dass Sie Eigenschaften von Elementen abh&auml;ngig von der &Auml;nderung anderer Eigenschaften ebenfalls &auml;ndern k&ouml;nnen. Dies gelingt, mitunter &uuml;ber kleine Umwege, auch mithilfe von Bindungen zwischen den Steuerelementen. So k&ouml;nnen Sie beispielsweise ganz einfach definieren, dass eine Eigenschaft den Wert True erh&auml;lt, wenn eine Eigenschaft eines anderen Elements auch diese Eigenschaft annimmt. Soll hingegen der Wert False &uuml;bernommen werden, wenn die andere Eigenschaft True lautet, wird es kompliziert &#8211; dann kommt ein Converter ins Spiel. Dieser Artikel zeigt die M&ouml;glichkeiten f&uuml;r den Ersatz von Triggern durch Binding auf.<\/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,44000023,44000003],"tags":[],"yst_prominent_words":[],"class_list":["post-55000063","post","type-post","status-publish","format-standard","hentry","category-662016","category-66062016","category-PowerApps","category-WPFGrundlagen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000063","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=55000063"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000063\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000063"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}