{"id":55000291,"date":"2021-12-01T00:00:00","date_gmt":"2022-03-31T21:33:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=291"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Registerseiten_im_TabControl_an_Daten_binden","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Registerseiten_im_TabControl_an_Daten_binden\/","title":{"rendered":"Registerseiten im TabControl an Daten binden"},"content":{"rendered":"<p><b>Im Artikel &#8220;TabControl: Das Registersteuerelement von WPF&#8221; haben wir uns die grundlegenden Eigenschaften des Registersteuerelements von .NET und WPF angesehen. Dieses bietet &auml;hnliche M&ouml;glichkeiten wie das Registersteuerelement, das Sie vielleicht von Microsoft Access kennen. An einigen Stellen gehen die M&ouml;glichkeiten, bedingt durch die gr&ouml;&szlig;ere Flexibilit&auml;t der Beschreibungssprache XAML, dar&uuml;ber hinaus. So k&ouml;nnen Sie beispielsweise das TabControl und seine TabItem-Elemente an eine Datenquelle wie eine ObservableCollection binden und die Daten der Objekte dieser Collection sowohl f&uuml;r die Gestaltung der Registerreiter als auch f&uuml;r den eigentlich Inhalt einer jeden Registerseite nutzen.<\/b><\/p>\n<p>Unter Microsoft Access m&uuml;ssen Sie, wenn Sie ein Registersteuerelement mit je einer Registerseite pro Datensatz versehen wollen, jede Registerseite per VBA-Code hinzuf&uuml;gen. Das gelingt zwar, aber unter .NET\/WPF ist das wesentlich komfortabler zu erledigen.<\/p>\n<p>Dazu legen Sie ein neues WPF-Projekt mit Visual Basic als Sprache an. Die nachfolgenden Elemente f&uuml;gen wir dem Hauptfenster <b>MainWindow.xaml <\/b>beziehungsweise der dazu geh&ouml;renden Code behind-Klasse <b>MainWindow.xaml.vb <\/b>hinzu.<\/p>\n<p>Das Ergebnis dieses Artikels soll wie in Bild 1 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_291_001.png\" alt=\"So soll das TabControl-Element aussehen\" width=\"474,6267\" height=\"292,9665\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: So soll das TabControl-Element aussehen<\/span><\/b><\/p>\n<h2>Personen-Auflistung als Datenquelle f&uuml;r ein TabControl<\/h2>\n<p>Unser Vorhaben ist es, die Elemente einer Klasse namens Person als Datenquelle f&uuml;r ein <b>TabControl<\/b>-Element zu nutzen. Diese Klasse haben wir wie folgt beschrieben:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Person\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Vorname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Nachname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Bild<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Der Datei <b>MainWindow.xaml.vb <\/b>f&uuml;gen wir au&szlig;erdem per <b>Imports<\/b>-Anweisung den Namespace <b>System.Collections.ObjectModel <\/b>hinzu, der die f&uuml;r dieses Beispiel ben&ouml;tigte <b>ObservableCollection<\/b>-Klasse beisteuert:<\/p>\n<pre>Imports System.Collections.ObjectModel<\/pre>\n<p>In der <b>MainWindow<\/b>-Klasse schlie&szlig;lich deklarieren wir zun&auml;chst die Property f&uuml;r die <b>Personen<\/b>-Liste. Diese deklarieren wir als Public, da sie als Datenquelle f&uuml;r das TabControl-Element dienen soll. Wir legen mit <b>Person <\/b>auch gleich den Typ der aufzunehmenden Objekte fest:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> MainWindow\r\n     <span style=\"color:blue;\">Public <\/span>Property Personen<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Person)<\/pre>\n<h2>Auflistung der anzuzeigenden Personen f&uuml;llen<\/h2>\n<p>Im Konstruktor der Klasse erledigen wir dann Aufgaben, die wir schon in vielen Artikeln durchgef&uuml;hrt haben. Wir deklarieren ein Objekt der Klasse <b>Person <\/b>und initialisieren das <b>ObservableCollection<\/b>-Element <b>Personen<\/b>:<\/p>\n<pre>     <span style=\"color:blue;\">Public <\/span>Sub New()\r\n         <span style=\"color:blue;\">Dim <\/span>Person<span style=\"color:blue;\"> As <\/span>Person\r\n         Personen = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Person)<\/pre>\n<p>Danach erstellen wir zwei <b>Person<\/b>-Elemente und weisen diesen die entsprechenden Eigenschaften zu. F&uuml;r die Eigenschaft <b>Bild <\/b>geben wir den Pfad von Bilddateien an, die wir im Projektmappen-Explorer in einem separaten Ordner namens <b>Images <\/b>gespeichert haben.<\/p>\n<p>Damit wir diese so wie hier mit <b>\\Images\\user_sunglasses.png <\/b>referenzieren k&ouml;nnen, m&uuml;ssen Sie f&uuml;r die Bilddateien die Eigenschaft <b>In Ausgabeverzeichnis kopieren <\/b>auf <b>Immer kopieren <\/b>oder <b>Kopieren, wenn neuer <\/b>einstellen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_291_002.png\" alt=\"Einstellung, damit die Bilddateien ins Ausgabeverzeichnis kopiert werden\" width=\"349,6267\" height=\"601,7315\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einstellung, damit die Bilddateien ins Ausgabeverzeichnis kopiert werden<\/span><\/b><\/p>\n<p>Der Code zum Anlegen der beiden vorerst ben&ouml;tigten <b>Person<\/b>-Elemente und zum Hinzuf&uuml;gen der Elemente mit der <b>Add<\/b>-Methode zur <b>Personen<\/b>-Liste sieht so aus:<\/p>\n<pre>         Person = <span style=\"color:blue;\">New<\/span> Person\r\n         <span style=\"color:blue;\">With<\/span> Person\r\n             .ID = 1\r\n             .Vorname = \"Andr&eacute;\"\r\n             .Nachname = \"Minhorst\"\r\n             .Bild = \"\\Images\\user_sunglasses.png\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         Personen.Add(Person)\r\n         Person = <span style=\"color:blue;\">New<\/span> Person\r\n         <span style=\"color:blue;\">With<\/span> Person\r\n             .ID = 2\r\n             .Vorname = \"Anja\"\r\n             .Nachname = \"Minhorst\"\r\n             .Bild = \"\\Images\\woman2.png\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         Personen.Add(Person)<\/pre>\n<p>Schlie&szlig;lich rufen wir noch die Methode <b>InitializeComponent <\/b>auf, damit die XAML-Definition angewendet wird, und stellen die Eigenschaft <b>DataContext <\/b>des Fensters auf das Code behind-Modul ein:<\/p>\n<pre>         InitializeComponent()\r\n         DataContext = Me\r\n     End Sub<\/pre>\n<p>Dies zeigt sch&ouml;n, wie die Trennung der Definition der Benutzeroberfl&auml;che und der Anwendungslogik unter WPF funktioniert. Wir haben noch keine Elemente zur Benutzeroberfl&auml;che hinzugef&uuml;gt und die Anwendungslogik ist quasi schon fertig. Nun k&ouml;nnen wir uns an den Entwurf der Benutzeroberfl&auml;che begeben.<\/p>\n<h2>Layout der Elemente vorbereiten<\/h2>\n<p>Wie oben im Bild zu erkennen, wollen wir nicht nur das <b>TabControl<\/b>-Element, sondern auch noch zwei Schaltfl&auml;chen hinzuf&uuml;gen, mit denen wir neue Elemente zum <b>TabControl<\/b>-Element hinzuf&uuml;gen oder vorhandene Elemente entfernen k&ouml;nnen. Damit die Schaltfl&auml;chen und das <b>TabControl<\/b>-Element nicht genau am Rand und aneinander kleben, definieren wir <b>Margin<\/b>&#8211; und <b>Padding<\/b>-Attribute f&uuml;r alle Elemente dieser Typen:<\/p>\n<pre>&lt;Window x:Class=\"MainWindow\" ... Title=\"MainWindow\" Height=\"250\" Width=\"400\"&gt;\r\n     &lt;Window.Resources&gt;\r\n         &lt;Style TargetType=\"Button\"&gt;\r\n             &lt;Setter Property=\"Margin\" Value=\"2\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"Padding\" Value=\"5\"&gt;&lt;\/Setter&gt;\r\n         &lt;\/Style&gt;\r\n         &lt;Style TargetType=\"TabControl\"&gt;\r\n             &lt;Setter Property=\"Margin\" Value=\"2\"&gt;&lt;\/Setter&gt;\r\n             &lt;Setter Property=\"Padding\" Value=\"5\"&gt;&lt;\/Setter&gt;\r\n         &lt;\/Style&gt;\r\n     &lt;\/Window.Resources&gt;<\/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\/55000291\/\">\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\/55000291?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\/55000291\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\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 &#8220;TabControl: Das Registersteuerelement von WPF&#8221; haben wir uns die grundlegenden Eigenschaften des Registersteuerelements von .NET und WPF angesehen. Dieses bietet &auml;hnliche M&ouml;glichkeiten wie das Registersteuerelement, das Sie vielleicht von Microsoft Access kennen. An einigen Stellen gehen die M&ouml;glichkeiten, bedingt durch die gr&ouml;&szlig;ere Flexibilit&auml;t der Beschreibungssprache XAML, dar&uuml;ber hinaus. So k&ouml;nnen Sie beispielsweise das TabControl und seine TabItem-Elemente an eine Datenquelle wie eine ObservableCollection binden und die Daten der Objekte dieser Collection sowohl f&uuml;r die Gestaltung der Registerreiter als auch f&uuml;r den eigentlich Inhalt einer jeden Registerseite nutzen.<\/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":[662021,66062021,44000017,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000291","post","type-post","status-publish","format-standard","hentry","category-662021","category-66062021","category-WebApps_Razor_Pages","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000291","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=55000291"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000291\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000291"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}