{"id":55000041,"date":"2016-06-01T00:00:00","date_gmt":"2020-03-27T19:20:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=41"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"WPFDatenbindung_ListenObjekte","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/WPFDatenbindung_ListenObjekte\/","title":{"rendered":"WPF-Datenbindung: Listen-Objekte"},"content":{"rendered":"<p><b>Wenn Sie WPF-Anwendungen erstellen wollen, wollen Sie die Daten der Anwendung in entsprechenden Fenstern darstellen. Ein Weg zu diesem Ziel ist das Bereitstellen der Daten in Listenform, also etwa als Collection oder Dictionary. Dieser Artikel zeigt, welche Schritte n&ouml;tig sind, um eine Liste von Objekten auf Basis einer einfachen Klasse zu erstellen und seine Daten in geeigneten Listen-Steuerelementen eines WPF-Fensters anzuzeigen.<\/b><\/p>\n<p>Im Beitrag <b>WPF-Datenbindung: Einfache Objekte <\/b>haben wir uns angesehen, wie Sie ein einfaches Objekt wie einen Kunden mit Eigenschaften wie <b>Vorname<\/b>, <b>Nachname <\/b>und <b>Geburtsdatum <\/b>in den Textfeldern eines WPF-Fensters anzeigen. Au&szlig;erdem haben Sie dort erfahren, wie Sie die Daten in beiden Richtungen synchron halten k&ouml;nnen.<\/p>\n<p>Nun wollen wir ein Listenobjekt wie beispielsweise eine <b>Col-lection <\/b>mit mehreren <b>Kunde<\/b>-Objekten f&uuml;llen und diese samt ausgew&auml;hlter Eigenschaften in verschiedenen Listen-Steuerelementen von WPF anzeigen &#8211; zum Beispiel im <b>DataGrid<\/b>, in der <b>ComboBox<\/b>, in der <b>ListBox <\/b>oder in der <b>ListView<\/b>. Welche Steuerelemente f&uuml;r die Darstellung einer Auflistung infrage kommen, h&auml;ngt &uuml;brigens allein davon ab, ob diese von der Klasse <b>ItemsControl <\/b>abgeleitet sind. Was die Listen-Objekte angeht, deren Inhalt wir im Listen-Steuerelement abbilden wollen, so m&uuml;ssen diese lediglich die <b>IEnumerable<\/b>-Schnittstelle implementieren.<\/p>\n<p>Ob ein Steuerelement die Klasse <b>ItemsControl <\/b>als Basistyp verwendet, k&ouml;nnen Sie beispielsweise im Objektkatalog nachlesen. Suchen Sie dort einfach nach dem gew&uuml;nschten Steuerelement und schauen sich im linken Bereich die Basistypen des Steuerelements an. In Bild 1 finden Sie beispielsweise <b>ItemsControl <\/b>als Basistyp f&uuml;r das <b>ComboBox<\/b>-Steuerelement vor.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_41_001.png\" alt=\"Pr&uuml;fen, ob ein Steuerelement zur Darstellung von Listen geeignet ist\" width=\"650\" height=\"399,2857\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Pr&uuml;fen, ob ein Steuerelement zur Darstellung von Listen geeignet ist<\/span><\/b><\/p>\n<p>Der Objektkatalog hilft auch dabei, die als Datenquelle f&uuml;r ein Listen-Steuerelement infrage kommenden Klassen zu identifizieren. In Bild 2 etwa erkennen wir, dass das <b>Collection<\/b>-Objekt die Schnittstelle <b>IEnumerable <\/b>implementiert und somit als Datenquelle taugt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_41_002.png\" alt=\"Untersuchen einer Klasse auf Listen-F&auml;higkeit\" width=\"425\" height=\"273,2143\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Untersuchen einer Klasse auf Listen-F&auml;higkeit<\/span><\/b><\/p>\n<h2>Liste mit Kunden f&uuml;llen<\/h2>\n<p>Schauen wir uns zun&auml;chst an, wie wir ein Listen-Objekt mit einigen verschiedenen <b>Kunde<\/b>-Objekten f&uuml;llen. Da wir in diesem Fall wissen, dass wir immer den gleichen Objekttyp zum Listen-Objekt hinzuf&uuml;gen m&ouml;chten, verwenden wir nicht die &uuml;blicherweise verwendeten Listen-Typen wie <b>Collection <\/b>oder <b>ArrayList<\/b>. Diese haben n&auml;mlich den Nachteil, dass sie beliebige Objekte aufnehmen k&ouml;nnen und dadurch beim Zugriff immer eine Typkonvertierung n&ouml;tig ist.<\/p>\n<p>Im Gegensatz dazu gibt es die typsicheren generischen Auflistungsklassen, bei denen man direkt bei der Deklaration angibt, welchen Typ die aufzunehmenden Elemente haben. Dieser wird dabei in spitzen Klammern hinter dem Schl&uuml;sselwort f&uuml;r die zu verwendende Auflistungsklasse angegeben. In unserem Beispiel wollen wir eine Methode namens <b>GetKunden <\/b>verwenden, um eine generische Auflistungsklasse des Typs <b>List <\/b>mit Elementen des Typs <b>Kunde <\/b>zu f&uuml;llen und zur&uuml;ckzugeben.<\/p>\n<p>Um die generische Klasse <b>List <\/b>zu verwenden, ben&ouml;tigen wir die Klasse <b>System.Collections.Generic<\/b>, die wir mit folgender Anweisung bereitstellen:<\/p>\n<pre>using System.Collections.Generic;<\/pre>\n<p>Die Methode <b>GetKunden<\/b> finden Sie in Listing 1. Nach dem Deklarieren und Initialisieren des <b>List<\/b>-Objekts <b>kunden <\/b>f&uuml;gt die Methode mit der <b>Add<\/b>-Methode nacheinander drei neue Objekte des Typs <b>Kunde <\/b>hinzu. Die Definition der Klasse <b>Kunde <\/b>entnehmen Sie dem Beispielprojekt (siehe <b>Kunde.cs<\/b>), eine Beschreibung dieser Klasse liefert der Artikel <b>WPF-Datenbindung: Einfache Objekte<\/b>.<\/p>\n<pre>private List&lt;Kunde&gt; GetKunden() {\r\n     List&lt;Kunde&gt; kunden = new List&lt;Kunde&gt;();\r\n     kunden.Add(new Kunde { Vorname = \"Andr&eacute;\", Nachname = \"Minhorst\", Geburtsdatum = new DateTime(1971, 1, 23) });\r\n     kunden.Add(new Kunde { Vorname = \"Klaus\", Nachname = \"M&uuml;ller\", Geburtsdatum = new DateTime(1981, 2, 3) });\r\n     kunden.Add(new Kunde { Vorname = \"Barbara\", Nachname = \"Schmitz\", Geburtsdatum = new DateTime(1976, 3, 4) });\r\n     return kunden;\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: F&uuml;llen einer generischen Liste mit Kunde-Objekten<\/span><\/b><\/p>\n<p>Die Methode <b>GetKunden <\/b>testen wir mit einer kleinen Methode, die durch die Schaltfl&auml;che <b>btnListenelementeAusgeben <\/b>unseres Beispielfensters <b>ListeBinden.xaml <\/b>ausgel&ouml;st wird (Code siehe Listing 2). Die Methode durchl&auml;uft die <b>Kunde<\/b>-Objekte der mit <b>GetKunden <\/b>gelieferten generischen Liste in einer <b>foreach<\/b>-Schleife und stellt damit eine Zeichenkette zusammen, welche Vorname, Nachname und Geburtsdatum der Kunden enth&auml;lt.<\/p>\n<pre>private void btnListenelementeAusgeben_Click(object sender, RoutedEventArgs e) {\r\n     List&lt;Kunde&gt; kunden = GetKunden();\r\n     string strKunden = \"\";\r\n     foreach(Kunde kunde in kunden) {\r\n         strKunden += \"\\n\" + kunde.Vorname + \" \" + kunde.Nachname + \" \" + kunde.Geburtsdatum.ToShortDateString();\r\n     }\r\n     MessageBox.Show(\"Kunden:\" + strKunden);\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Testen der Methode GetKunden<\/span><\/b><\/p>\n<p>Die Zeichenkette gibt die Methode dann per <b>MessageBox <\/b>auf der Benutzeroberfl&auml;che aus (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_41_003.png\" alt=\"Ausgabe der Daten einer Klasse\" width=\"425\" height=\"350,3817\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ausgabe der Daten einer Klasse<\/span><\/b><\/p>\n<h2>Liste an ListBox binden<\/h2>\n<p>Wenn wir einmal eine Auflistung mit den gew&uuml;nschten Objekten gef&uuml;llt haben, ist die Anzeige in einem Listen-Steuer-element nicht mehr besonders kompliziert. Wir wollen es zun&auml;chst mit einem <b>ListBox<\/b>-Steuerelement probieren.<\/p>\n<p>Dazu f&uuml;gen Sie zum Grid des Fensters wie in Listing 3 ein <b>Label<\/b>&#8211; und ein <b>ListBox<\/b>-Element hinzu.<\/p>\n<pre>&lt;Grid&gt;\r\n     &lt;Grid.ColumnDefinitions&gt;\r\n         &lt;ColumnDefinition Width=\"60\" \/&gt;\r\n         &lt;ColumnDefinition Width=\"*\" \/&gt;\r\n     &lt;\/Grid.ColumnDefinitions&gt;\r\n     &lt;Grid.RowDefinitions&gt;\r\n         &lt;RowDefinition Height=\"30\" \/&gt;\r\n         &lt;RowDefinition Height=\"130\" \/&gt;\r\n         &lt;RowDefinition Height=\"30\" \/&gt;\r\n     &lt;\/Grid.RowDefinitions&gt;\r\n     &lt;StackPanel Orientation=\"Horizontal\" Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\"&gt;\r\n         &lt;Button Content=\"Listenelemente ausgeben\" Name=\"btnListenelementeAusgeben\" Margin=\"5,5,5,5\" \r\n             Click=\"btnListenelementeAusgeben_Click\"\/&gt;\r\n     &lt;\/StackPanel&gt;\r\n     &lt;Label Content=\"Kunden:\" Grid.Row=\"1\" Grid.Column=\"0\" \/&gt;\r\n     &lt;ListBox x:Name=\"lstKunden\" Margin=\"5,5,5,5\" VerticalAlignment=\"Top\" Grid.Row=\"1\" Grid.Column=\"1\" \/&gt;\r\n&lt;\/Grid&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Definition des Grids mit dem ListBox-Steuerelement<\/span><\/b><\/p>\n<p>F&uuml;r das <b>ListBox<\/b>-Steuerelement legen wir vorerst keine weiteren Eigenschaften fest. Das F&uuml;llen erledigen wir mit zwei Anweisungen, die beim &Ouml;ffnen des Fensters ausgef&uuml;hrt werden und daher in der Konstruktor-Methode der Klasse <b>ListeBinden.xaml.cs <\/b>landen.<\/p>\n<p>Die erste Anweisung stellt die Eigenschaft <b>ItemsSource <\/b>auf die Methode <b>GetKunden <\/b>ein, die zweite erkl&auml;rt das Feld <b>Nachname <\/b>zu dem Feld, das im Listenfeld angezeigt werden soll:<\/p>\n<pre>public ListeBinden() {\r\n     InitializeComponent();\r\n     lstKunden.ItemsSource = GetKunden();\r\n     lstKunden.DisplayMemberPath = \"Nachname\";\r\n}<\/pre>\n<p>Das Ergebnis sieht schon einmal den Erwartungen entsprechend aus, wie Bild 4 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_41_004.png\" alt=\"Anzeigen von Kunden in einer ListBox\" width=\"425\" height=\"252,6224\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anzeigen von Kunden in einer ListBox<\/span><\/b><\/p>\n<h2>Gew&auml;hltes Objekt anzeigen<\/h2>\n<p>Zun&auml;chst wollen wir uns ansehen, wie wir die Inhalte des aktuell gew&auml;hlten Eintrags des <b>ListBox<\/b>-Steuerelements im Fenster anzeigen k&ouml;nnen. Dazu f&uuml;gen wir zun&auml;chst drei Textfelder zu jeweils einer neuen Zeile im Grid hinzu.<\/p>\n<p>Diese Textfelder binden wir gleich &uuml;ber einen speziellen Wert f&uuml;r das Attribut <b>Text <\/b>an ein Feld des aktuell in der <b>ListBox <\/b>ausgew&auml;hlten Objekts, f&uuml;r das Textfeld <b>txtVorname <\/b>beispielsweise wie folgt:<\/p>\n<pre>&lt;TextBox x:Name=\"txtVorname\" \r\n     Text=\"{Binding Path=Vorname}\" ... \/&gt;<\/pre>\n<p>Das allein hilft allerdings noch nicht, da das aktuell ausgew&auml;hlte Objekt im <b>ListBox<\/b>-Steuerelement noch als <b>DataContext <\/b>angegeben werden muss. Wenn Sie nur ein einziges Textfeld an das Objekt im <b>ListBox<\/b>-Steuerelement binden wollten, k&ouml;nnten Sie das Attribut <b>DataContext <\/b>gleich dem entsprechenden <b>TextBox<\/b>-Steuerelement hinzuf&uuml;gen:<\/p>\n<pre>&lt;TextBox DataContext=\"{Binding ElementName=lstKunden,     Path=SelectedItem}\" x:Name=\"txtVorname\"     Text=\"{Binding Path=Vorname}\" ... \/&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\/55000041\/\">\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\/55000041?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\/55000041\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"45e493ab83\"\/>\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>Wenn Sie WPF-Anwendungen erstellen wollen, wollen Sie die Daten der Anwendung in entsprechenden Fenstern darstellen. Ein Weg zu diesem Ziel ist das Bereitstellen der Daten in Listenform, also etwa als Collection oder Dictionary. Dieser Artikel zeigt, welche Schritte n&ouml;tig sind, um eine Liste von Objekten auf Basis einer einfachen Klasse zu erstellen und seine Daten in geeigneten Listen-Steuerelementen eines WPF-Fensters anzuzeigen.<\/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,66032016,44000029,44000035,44000008,44000003],"tags":[],"yst_prominent_words":[66062022,66062051,66062047],"class_list":["post-55000041","post","type-post","status-publish","format-standard","hentry","category-662016","category-66032016","category-Access_programmieren","category-COMDLLs_programmieren","category-Datenzugriffstechnik","category-WPFGrundlagen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000041","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=55000041"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000041\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000041"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}