{"id":55000029,"date":"2016-04-01T00:00:00","date_gmt":"2020-03-27T19:18:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=29"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"WPFControls_Kombinationsfelder","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/WPFControls_Kombinationsfelder\/","title":{"rendered":"WPF-Controls: Kombinationsfelder"},"content":{"rendered":"<p><b>In den ersten Ausgaben des DATENBANKENTWICKLERs haben Sie bereits einige Steuerelemente kurz kennen gelernt. In den folgenden Ausgaben wird sich dies &auml;ndern. Im vorliegenden Artikel schauen wir uns das ComboBox-Steuerelement an, das Sie als Access-Entwickler ja vielleicht aus dem Eff-Eff kennen. Unter WPF l&auml;uft aber gew&ouml;hnlich alles etwas anders, sodass wir hier mit den Grundlagen einsteigen und uns dann Schritt f&uuml;r Schritt Themen wie der Datenbindung et cetera widmen. Au&szlig;erdem d&uuml;rfen wir vorwegnehmen, dass sich hier einige M&ouml;glichkeiten mehr ergeben &#8230;<\/b><\/p>\n<p>Wenn Sie ein <b>ComboBox<\/b>-Steuerelement zu einem Fenster hinzuf&uuml;gen und das Debugging starten, erhalten Sie ein einfaches Kombinationsfeld, das beim Aufklappen keine Werte anzeigt und in das Sie auch keinen Text einf&uuml;gen k&ouml;nnen. Das ist der erste Unterschied im Vergleich zu einem Access-Kombinationsfeld &#8211; dort k&ouml;nnen Sie zumindest gleich einen Wert eintippen.<\/p>\n<p>Eine recht einfache Definition eines solchen <b>ComboBox<\/b>-Steuerelements sieht so aus:<\/p>\n<pre>&lt;ComboBox x:Name=\"comboBox\" HorizontalAlignment=\"Left\" Margin=\"127,10,0,0\" VerticalAlignment=\"Top\" Width=\"120\"\/&gt;<\/pre>\n<h2>ComboBox mit statischen Werten<\/h2>\n<p>Soll die <b>ComboBox <\/b>beim &Ouml;ffnen des Fensters immer die gleichen Werte anzeigen, k&ouml;nnen Sie diese ganz einfach durch eine entsprechende XAML-Definition hinzuf&uuml;gen. Dies &auml;hnelt dann dem Anlegen von Eintr&auml;gen in einem HTML-Select-Element, allerdings verwenden Sie f&uuml;r jeden neuen Eintrag ein <b>ComboBoxItem<\/b>-Element, das Sie unterhalb des <b>ComboBox<\/b>-Elements anlegen:<\/p>\n<pre>&lt;ComboBox x:Name=\"comboBox\" ... &gt;\r\n     &lt;ComboBoxItem&gt;Eintrag 1&lt;\/ComboBoxItem&gt;\r\n     &lt;ComboBoxItem&gt;Eintrag 2&lt;\/ComboBoxItem&gt;\r\n     &lt;ComboBoxItem&gt;Eintrag 3&lt;\/ComboBoxItem&gt;\r\n     &lt;ComboBoxItem&gt;Eintrag 4&lt;\/ComboBoxItem&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>W&auml;hrend Sie diese Eintr&auml;ge unterhalb des <b>ComboBox<\/b>-Elements hinzuf&uuml;gen, zeigt der XAML-Editor direkt die Eintr&auml;ge in der Vorschau an (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_29_001.png\" alt=\"WPF-Fenster mit einer Schaltfl&auml;che in drei verschiedenen Designs\" width=\"500\" height=\"339,2283\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: WPF-Fenster mit einer Schaltfl&auml;che in drei verschiedenen Designs<\/span><\/b><\/p>\n<p>Im Betrieb erscheint dieses Kombinationsfeld nun wie in Bild 2. Beim Aufklappen zeigt es die vier Eintr&auml;ge an, die Auswahl eines Eintrags tr&auml;gt diesen oben in das Steuerelement ein. Nun wollen wir dies noch erweitern, und zwar erstens durch die Eingabe von Texten durch den Benutzer.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_29_002.png\" alt=\"Statisches Kombinationsfeld mit vier Eintr&auml;gen\" width=\"425\" height=\"141,3895\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Statisches Kombinationsfeld mit vier Eintr&auml;gen<\/span><\/b><\/p>\n<h2>ComboBox bedienen<\/h2>\n<p>Nat&uuml;rlich wissen Sie, dass Sie eine ComboBox mit einem Mausklick auf den Pfeil nach unten &ouml;ffnen und dass Sie dort Text eingeben und Eintr&auml;ge ausw&auml;hlen k&ouml;nnen. Aber haben Sie auch schon einmal nur mit der Tastatur auf eine ComboBox zugegriffen Sie k&ouml;nnen diese n&auml;mlich auch durch Bet&auml;tigen der Taste <b>F4 <\/b>&ouml;ffnen oder schlie&szlig;en. Auch die Tastenkombinationen <b>Alt + Nach oben <\/b>oder <b>Alt + Nach unten <\/b>&ouml;ffnen und schlie&szlig;en die Liste des <b>ComboBox<\/b>-Steuerelements. Schlie&szlig;lich bl&auml;ttern Sie auch bei nicht ausgeklappter Liste mit den Tasten <b>Nach oben <\/b>und <b>Nach unten <\/b>durch die Eintr&auml;ge, wobei <b>Nach oben <\/b>vom obersten Element und <b>Nach unten <\/b>vom untersten Element aus keine Auswirkungen zeigen.<\/p>\n<h2>Eingabe von Werten aktivieren<\/h2>\n<p>Um das Eingabefeld des Kombinationsfeldes zu aktivieren, f&uuml;gen Sie einfach nur das Attribut <b>IsEditable <\/b>zum <b>ComboBox<\/b>-Element hinzu und stellen es auf den Wert <b>True <\/b>ein:<\/p>\n<pre>&lt;ComboBox x:Name=\"cboMitEingabe\" ... IsEditable=\"True\"&gt;\r\n     &lt;ComboBoxItem Content=\"Eintrag 1\"\/&gt;\r\n     ...\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>Damit k&ouml;nnen Sie nun Werte wie in Bild 3 eingeben. Allerdings f&uuml;gt dies den Wert noch nicht zur Auswahlliste hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_29_003.png\" alt=\"Hinzuf&uuml;gen eines eigenen Textes\" width=\"425\" height=\"156,3601\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen eines eigenen Textes<\/span><\/b><\/p>\n<p>Wenn Sie den Anfangsbuchstaben eines der bereits in der Liste enthaltenen Eintr&auml;ge eingeben, wird dieser &uuml;brigens gleich als Eintrag vorgeschlagen (siehe Bild 4) &#8211; wie auch unter Access. Nach der Eingabe eines Wertes in das Textfeld pr&uuml;ft die ComboBox, ob dieser Wert bereits in der Liste enthalten ist. Falls ja, wird dieser Eintrag als markiert gekennzeichnet &#8211; sp&auml;ter schauen wir uns an, wie wir dies nutzen k&ouml;nnen. Ist der Wert nicht vorhanden, hat die Liste keinen selektierten Eintrag. In beiden F&auml;llen wird der Wert jedoch in die Eigenschaft <b>Text <\/b>des <b>ComboBox<\/b>-Steuerelements eingetragen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_29_004.png\" alt=\"Autoerg&auml;nzung standardm&auml;&szlig;ig\" width=\"425\" height=\"108,1213\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Autoerg&auml;nzung standardm&auml;&szlig;ig<\/span><\/b><\/p>\n<h2>IsEditable und IsReadOnly<\/h2>\n<p>Selbst wenn Sie das Attribut <b>IsEditable <\/b>auf <b>True <\/b>eingestellt haben, k&ouml;nnen Sie die Eingabe von Texten in das Textfeld des Kombinationsfeldes unterbinden. Dazu stellen Sie die Eigenschaft <b>IsReadOnly <\/b>ebenfalls auf <b>True <\/b>ein. Der Unterschied zwischen <b>IsEditable=False <\/b>sowie <b>IsEditable=True <\/b>und <b>IsReadOnly=True <\/b>ist, dass der Hintergrund des Eingabefeldes nicht grau, sondern wei&szlig; dargestellt wird.<\/p>\n<pre>&lt;ComboBox x:Name=\"cboMitEingabe\" ... IsEditable=\"True\" \r\n         IsReadOnly=\"True\"&gt;\r\n     ...\r\n&lt;\/ComboBox&gt;<\/pre>\n<h2>Ein Element vorausw&auml;hlen per XAML<\/h2>\n<p>Unter Access\/VBA haben Sie etwa die folgende Zeile verwendet, um beispielsweise den ersten Eintrag eines Kombinationsfeldes etwa beim &Ouml;ffnen des Formulars zu markieren:<\/p>\n<pre>Me!cboEintraege = Me!cboEintraege.ItemData(0)<\/pre>\n<p>Unter WPF k&ouml;nnen Sie dieses Element gleich in der Definition markieren, sofern diese &uuml;berhaupt per Definition festgelegt und nicht dynamisch mit einer anderen Datenherkunft gef&uuml;llt wird. Dazu f&uuml;gen Sie dem zu markierenden Eintrag das Attribut <b>IsSelected <\/b>mit dem Wert <b>True <\/b>hinzu:<\/p>\n<pre>&lt;ComboBox x:Name=\"cboMitStandardwert\" ... \r\n         IsEditable=\"True\" IsReadOnly=\"True\"&gt;\r\n     &lt;ComboBoxItem Content=\"Eintrag 1\" IsSelected=\"True\"\/&gt;\r\n     &lt;ComboBoxItem Content=\"Eintrag 2\"\/&gt;\r\n     &lt;ComboBoxItem Content=\"Eintrag 3\"\/&gt;\r\n     &lt;ComboBoxItem Content=\"Eintrag 4\"\/&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>Das Ergebnis finden Sie in Bild 5. Der Text des gew&auml;hlten Eintrags wird nicht nur im Eingabefeld angezeigt, sondern beim Ausklappen der Liste auch optisch hervorgehoben (siehe Beispiel 3a des Beispielprojekts).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_02\/pic_29_005.png\" alt=\"ComboBox mit voreingestelltem Wert\" width=\"425\" height=\"147,2113\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: ComboBox mit voreingestelltem Wert<\/span><\/b><\/p>\n<h2>Ein Element vorausw&auml;hlen per C#<\/h2>\n<p>Nat&uuml;rlich k&ouml;nnen Sie ein Element auch per Code ausw&auml;hlen wie unter Access\/VBA. Dazu nutzen wir die Ereignismethode, die durch das Ereignis <b>Loaded <\/b>des Fensters ausgel&ouml;st wird. Damit diese bekannt ist, f&uuml;gen wir die Eigenschaft <b>Loaded <\/b>zum <b>Window<\/b>-Element hinzu (dazu den Attributnamen eingeben, Tabulator-Taste dr&uuml;cken und den dann erscheinenden Eintrag <b><Neuer Ereignishandler> <\/b>ausw&auml;hlen, um die Methode gleich automatisch anzulegen):<\/p>\n<pre>&lt;Window x:Class=\"ComboBoxBeispiele.MainWindow\" ...        Title=\"MainWindow\" ... Loaded=\"Window_Loaded\"&gt;<\/pre>\n<p>Diese Methode f&uuml;llen Sie im C#-Modul zum Fenster wie folgt mit einer einzigen Anweisung auf:<\/p>\n<pre>private void Window_Loaded(object sender, RoutedEventArgs e) {\r\n     cboMitStandardwertCSharp.SelectedIndex = 0;\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\/55000029\/\">\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\/55000029?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\/55000029\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9fac6dd15a\"\/>\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>In den ersten Ausgaben des DATENBANKENTWICKLERs haben Sie bereits einige Steuerelemente kurz kennen gelernt. In den folgenden Ausgaben wird sich dies &auml;ndern. Im vorliegenden Artikel schauen wir uns das ComboBox-Steuerelement an, das Sie als Access-Entwickler ja vielleicht aus dem Eff-Eff kennen. Unter WPF l&auml;uft aber gew&ouml;hnlich alles etwas anders, sodass wir hier mit den Grundlagen einsteigen und uns dann Schritt f&uuml;r Schritt Themen wie der Datenbindung et cetera widmen. Au&szlig;erdem d&uuml;rfen wir vorwegnehmen, dass sich hier einige M&ouml;glichkeiten mehr ergeben &#8230;<\/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":[66022016,662016,44000002,44000021,44000025,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000029","post","type-post","status-publish","format-standard","hentry","category-66022016","category-662016","category-Benutzeroberflaeche_mit_WPF","category-Entity_Framework","category-VBAProgrammierung","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000029","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=55000029"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000029\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000029"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000029"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000029"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}