{"id":55000212,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T14:43:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=212"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Onlinebanking_mit_DDBAC_Benutzeroberflaeche","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Onlinebanking_mit_DDBAC_Benutzeroberflaeche\/","title":{"rendered":"Onlinebanking mit DDBAC: Benutzeroberfl&auml;che"},"content":{"rendered":"<p><b>Nachdem wir die Funktionen zum Abrufen von Kontost&auml;nden und Ums&auml;tzen sowie f&uuml;r das &Uuml;berweisen programmiert haben, k&ouml;nnen wir uns an den Entwurf einer Benutzeroberfl&auml;che f&uuml;r diese Funktionen begeben. Diese soll kompakte Formulare f&uuml;r die wichtigsten bereits behandelten Onlinebanking-Funktionen enthalten. Dazu geh&ouml;rt die Auswahl von Bankaccount und Konto sowie die Anzeige von Ums&auml;tzen und Kontostand. Dies erledigen wir im Hauptfenster der Anwendung. Ein weiteres Fenster erlaubt dann das Ausf&uuml;hren einer &Uuml;berweisung f&uuml;r das aktuell im Hauptfenster ausgew&auml;hlte Konto. Au&szlig;erdem ben&ouml;tigen wir noch eine Tabelle, mit der wir die abgefragten Umsatzdaten speichern k&ouml;nnen. Diese f&uuml;gen wir per Entity Framework hinzu.<\/b><\/p>\n<p><b>Voraussetzungen<\/b><\/p>\n<p><b>Voraussetzung f&uuml;r das Umsetzen der L&ouml;sung dieses Artikels ist das Vorhandensein einer DDBAC-Lizenz. Die damit nutzbaren Komponenten sind leider nicht mehr kostenlos verf&uuml;gbar, sondern m&uuml;ssen lizensiert werden, bevor man diese in seine Produkte einbauen kann. Lizenzen finden Sie im Onlineshop unter <b>https:\/\/shop.minhorst.com\/access-tools\/295\/ddbac-jahreslizenzc=78<\/b>. <\/b><\/p>\n<p><b>Vorbereitungen<\/b><\/p>\n<p>Als Projekt legen wir ein neues Projekt des Typs <b>Visual Basic|Windows Desktop|WPF-App <\/b>an.<\/p>\n<p>Dann f&uuml;gen wir ein neues Element des Typs <b>ADO.NET Entity Data Model <\/b>hinzu. Dieses dient dazu, ein Entity Data Model zu erstellen und &uuml;ber dieses automatisch eine Datenbank mit der ben&ouml;tigten Tabelle zu generieren. Nachdem Sie mit dem Men&uuml;-befehl <b>Projekt|Neues Element hinzuf&uuml;gen&#8230; <\/b>den Dialog <b>Neues Element hinzuf&uuml;gen <\/b>ge&ouml;ffnet haben, tragen Sie den Namen des Entity Data Models ein (hier <b>OnlinebankingContext<\/b>) und klicken auf <b>Hinzuf&uuml;gen<\/b>. Im nun erscheinenden <b>Assistent f&uuml;r Entity Data Model <\/b>w&auml;hlen Sie den Typ <b>Leeres Code First-Modell <\/b>aus. Wenige Sekunden sp&auml;ter hat der Assistent die notwendigen Elemente hinzugef&uuml;gt.<\/p>\n<p>Durch diesen Schritt haben wir au&szlig;erdem direkt &Auml;nderungen an der Datei <b>App.config <\/b>vorgenommen. Dort steht nun im Element <b>connectionStrings <\/b>die Verbindungszeichenfolge, mit der wir sp&auml;ter die Datenbank zum Speichern der Ums&auml;tze erstellen und verwenden.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch eine Referenz auf die DDBAC-Komponenten, die den Zugriff auf Ihre Konten &uuml;berhaupt erst erm&ouml;glichen. Dazu f&uuml;gen Sie dem Projekt den Verweis aus Bild 1 hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_212_001.png\" alt=\"Verweis auf die DDBAC-Bibliothek\" width=\"649,559\" height=\"279,8978\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf die DDBAC-Bibliothek<\/span><\/b><\/p>\n<p><b>Kontostand anzeigen<\/b><\/p>\n<p>Wir beginnen mit der Anzeige des Kontostands. Hier wollen wir in einem Fenster die Auswahl des Kontakts und anschlie&szlig;end des gew&uuml;nschten Kontos erlauben. Per Klick auf eine Schaltfl&auml;che soll dann der Kontostand eingelesen und in einem Textfeld angezeigt werden. Wie Sie bereits in den vorherigen Artikeln erfahren haben, legen wir die Kontakte und Konten &uuml;ber die Systemsteuerung an, und zwar &uuml;ber die App <b>Homebanking Administrator (32-Bit)<\/b>. Auf die dort angelegten und synchronisierten Elemente k&ouml;nnen wir dann per Code zugreifen.<\/p>\n<p>Ein neues WPF-Fenster soll nun zun&auml;chst ein Kombinationsfeld zur Auswahl des Kontakts anbieten. Nachdem der Benutzer dort einen Eintrag ausgew&auml;hlt hat, sollen die zum gew&auml;hlten Kontakt geh&ouml;renden Konten in einem zweiten Kombinationsfeld angezeigt werden. Das passende Steuer-element f&uuml;r diesen Zweck ist jeweils das <b>ComboBox<\/b>-Element. Also f&uuml;gen wir zun&auml;chst zwei solche Elemente im Hauptfenster <b>MainWindow.xaml <\/b>an. Damit die zus&auml;tzlich angelegten Bezeichnungsfelder optisch ansprechend dargestellt werden, erstellen wir zuvor einige Spalten und Zeilen im bereits vorhandenen <b>Grid<\/b>-Element.<\/p>\n<p><b>Klasse f&uuml;r die Kontakte anlegen<\/b><\/p>\n<p>Die &uuml;ber die Systemsteuerung hinzuf&uuml;gten Onlinebanking-Kontakte lesen wir mithilfe der im Artikel <b>Onlinebanking mit DDBAC: Saldo und Ums&auml;tze <\/b>beschriebenen Funktion ein, die wir jedoch leicht abwandeln. Die eingelesenen Daten sollen je Kontakt in einer neuen Instanz der nachfolgend beschriebenen Klasse landen:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Contact\r\n     <span style=\"color:blue;\">Public <\/span>BankCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>CountryCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>UserID<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Diese Klasse legen Sie als neues Element im Projekt an und speichern es unter <b>Contact.vb<\/b>. Wir ben&ouml;tigen allerdings die <b>INotifyPropertyChanged<\/b>-Schnittstelle in dieser Klasse, daher &auml;ndern wir diese wie folgt.<\/p>\n<p>Wir f&uuml;gen au&szlig;erdem noch eine Eigenschaft namens <b>BACContact <\/b>hinzu, mit der wir einen Verweis auf das <b>BACContact<\/b>-Objekt speichern, aus dem wir die Eigenschaften der Klasse ausgelesen haben:<\/p>\n<pre>Imports System.ComponentModel\r\n<span style=\"color:blue;\">Public Class<\/span> Contact\r\n     Implements INotifyPropertyChanged\r\n     <span style=\"color:blue;\">Public <\/span>Event PropertyChanged<span style=\"color:blue;\"> As <\/span>PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged\r\n     Protected Overridable Sub OnPropertyChanged(propname<span style=\"color:blue;\"> As String<\/span>)\r\n         RaiseEvent PropertyChanged(Me, <span style=\"color:blue;\">New<\/span> PropertyChangedEventArgs(propname))\r\n     End Sub\r\n     <span style=\"color:blue;\">Private <\/span>_bankCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_countryCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_userID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_bACContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     <span style=\"color:blue;\">Public <\/span>Property BankCode<span style=\"color:blue;\"> As String<\/span>\r\n         Get\r\n             Return _bankCode\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n             _bankCode = value\r\n             OnPropertyChanged(\"BankCode\")\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n     <span style=\"color:blue;\">Public <\/span>Property CountryCode<span style=\"color:blue;\"> As String<\/span>\r\n         Get\r\n             Return _countryCode\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n             _countryCode = value\r\n             OnPropertyChanged(CountryCode)\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n     <span style=\"color:blue;\">Public <\/span>Property UserID<span style=\"color:blue;\"> As String<\/span>\r\n         Get\r\n             Return _userID\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n             _userID = value\r\n             OnPropertyChanged(\"UserID\")\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n     <span style=\"color:blue;\">Public <\/span>Property BACContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n         Get\r\n             Return _bACContact\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As <\/span>BACContact)\r\n             _bACContact = value\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b>Klasse f&uuml;r die Konten anlegen<\/b><\/p>\n<p>Die Klasse f&uuml;r die Konten sieht &auml;hnlich aus wie die f&uuml;r die Kontakte. Auch hier implementieren wir die <b>INotifyPropertyChanges<\/b>-Schnittstelle. Die Klasse bietet die Eigenschaften <b>AccountNumber<\/b>, <b>AcctName<\/b>, <b>BIC <\/b>und <b>IBAN <\/b>an. Dar&uuml;berhinaus wollen wir das <b>BACAccount<\/b>-Objekt, &uuml;ber das wir die Klasse f&uuml;llen, mit den Instanzen der Klasse speichern. Die Klassendefinition sieht wie folgt aus:<\/p>\n<pre>Imports System.ComponentModel\r\nImports BankingApplicationComponents\r\n<span style=\"color:blue;\">Public Class<\/span> Account\r\n     Implements INotifyPropertyChanged\r\n     <span style=\"color:blue;\">Public <\/span>Event PropertyChanged<span style=\"color:blue;\"> As <\/span>PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged\r\n     Protected Overridable Sub OnPropertyChanged(propname<span style=\"color:blue;\"> As String<\/span>)\r\n         RaiseEvent PropertyChanged(Me, <span style=\"color:blue;\">New<\/span> PropertyChangedEventArgs(propname))\r\n     End Sub\r\n     <span style=\"color:blue;\">Private <\/span>_accountNumber<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_acctName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_bIC<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_iBAN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_bACAccount<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     <span style=\"color:blue;\">Public <\/span>Property AccountNumber<span style=\"color:blue;\"> As String<\/span>\r\n         Get\r\n             Return _accountNumber\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n             _accountNumber = value\r\n             OnPropertyChanged(\"AccountNumber\")\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n     ... weitere Property-Eigenschaften\r\n     <span style=\"color:blue;\">Public <\/span>Property BACAccount<span style=\"color:blue;\"> As <\/span>BACAccount\r\n         Get\r\n             Return _bACAccount\r\n         End Get\r\n         Set(value<span style=\"color:blue;\"> As <\/span>BACAccount)\r\n             _bACAccount = value\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b>Auflistung mit Kontakt-Elementen f&uuml;llen<\/b><\/p>\n<p>Wenn die Anwendung gestartet und somit das Fenster <b>MainWindow.xaml <\/b>ge&ouml;ffnet wird, sollen die Kontakte aus der Systemsteuerung eingelesen und in jeweils eine neue Klasse des Typs <b>Contact <\/b>geschrieben werden. Die neuen Instanzen wollen wir au&szlig;erdem direkt zu einer Liste hinzuf&uuml;gen, die wir anschlie&szlig;end dem ersten <b>ComboBox<\/b>-Element zuweisen k&ouml;nnen. Wir nutzen dazu eine Funktion namens <b>GetBACContacts<\/b>, die eine Liste von Elementen des Typs <b>BACContact <\/b>liefert. Diese f&uuml;gen wir einem Modul namens <b>DDBACObjects.vb <\/b>hinzu, dem wir au&szlig;erdem noch per <b>Imports<\/b>-Anweisung die Elemente des Namespace <b>BankingApplicationComponents <\/b>hinzuf&uuml;gen.<\/p>\n<p>Die folgende privat deklarierte Variable speichert die <b>Contacts<\/b>-Auflistung zwischen, damit diese nicht bei jedem Zugriff erneut ausgelesen werden m&uuml;ssen:<\/p>\n<pre>     <span style=\"color:blue;\">Private <\/span>m_Contacts<span style=\"color:blue;\"> As <\/span>BACContacts<\/pre>\n<p>Die Funktion <b>GetBACContacts <\/b>liest die Kontakte mit den Methoden der DDBAC-Bibliothek aus der Systemsteuerung in die Variable <b>m_BACContacts <\/b>ein. Diese wird dann anschlie&szlig;end auch als Ergebnis der Funktion zur&uuml;ckgegeben. Wenn <b>m_BACContacts <\/b>bereits vorhanden ist, wird die Auflistung nicht erneut gef&uuml;llt. Einzige Ausnahme ist, wenn der Aufruf den Wert <b>True <\/b>f&uuml;r den Parameter <b>bolReset <\/b>enth&auml;lt. In diesem Fall werden die Kontakte auf jeden Fall erneut eingelesen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetBACContacts(<span style=\"color:blue;\">Optional<\/span> bolReset<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> As <\/span>BACContacts\r\n     <span style=\"color:blue;\">If <\/span>m_BACContacts Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         m_BACContacts = <span style=\"color:blue;\">New<\/span> BACContacts\r\n         m_BACContacts.Populate(\"\")\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolReset = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             m_BACContacts.Populate(\"\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Return m_BACContacts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Damit haben wir mit <b>GetBACContacts <\/b>eine Liste der <b>BACContact<\/b>-Elemente eingelesen. Diese m&uuml;ssen wir nun noch in eine <b>ObservableCollection <\/b>mit Elementen des oben definierten Typs <b>Contact <\/b>umf&uuml;llen. Diese Liste wollen wir dann als Datenquelle des ersten <b>ComboBox<\/b>-Elements in unserem Fenster verwenden. Diese Aufgabe &uuml;bernimmt die Funktion <b>GetContacts<\/b>. Sie erstellt eine neue <b>ObservableCollection <\/b>in der Variablen <b>objContacts<\/b>. Dann durchl&auml;uft sie eine <b>For Each<\/b>-Schleife &uuml;ber alle <b>BACContact<\/b>-Elemente, welche die oben beschriebene Funktion <b>GetContacts <\/b>liefert. Innerhalb der Schleife legt sie ein neues <b>Contact<\/b>-Element an (nicht zu verwechseln mit <b>BACContact<\/b>), und schreibt die entsprechenden Werte in die Eigenschaften <b>BankCode<\/b>, <b>CountryCode <\/b>und <b>UserID <\/b>sowie einen Verweis auf das aktuelle <b>BACContact<\/b>-Objekt in die Eigenschaft <b>BACContact<\/b>. Anschlie&szlig;end f&uuml;gt sie das neu erstellte und gef&uuml;llte Objekt zur ObservableCollection hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetContacts()<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Contact)\r\n     <span style=\"color:blue;\">Dim <\/span>objContacts<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Contact)\r\n     <span style=\"color:blue;\">Dim <\/span>objContact<span style=\"color:blue;\"> As <\/span>Contact\r\n     <span style=\"color:blue;\">Dim <\/span>objBACContact<span style=\"color:blue;\"> As <\/span>BACContact\r\n     objContacts = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Contact)\r\n     For Each objBACContact In GetBACContacts()\r\n         objContact = <span style=\"color:blue;\">New<\/span> Contact\r\n         <span style=\"color:blue;\">With<\/span> objContact\r\n             .BankCode = objBACContact.BankCode\r\n             .CountryCode = objBACContact.CountryCode\r\n             .UserID = objBACContact.UserID\r\n             .BACContact = objBACContact\r\n             objContacts.Add(objContact)\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span>\r\n     Return objContacts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Auflistung f&uuml;r die Konten f&uuml;llen<\/b><\/p>\n<p>Wenn der Benutzer in der gleich noch zu erstellenden ComboBox einen Kontakt ausgew&auml;hlt hat, soll die zweite ComboBox die zu diesem Kontakt geh&ouml;renden Konten zur Auswahl anbieten. Deshalb ben&ouml;tigen wir analog zu den oben beschriebenen Funktionen <b>GetBACContacts <\/b>und <b>GetContacts<\/b> eine weitere Funktion.<\/p>\n<p>Die Funktion <b>GetBACAccounts <\/b>erwartet als Parameter ein <b>BACContact<\/b>-Objekt, zu dem sie die <b>BACAccount<\/b>-Objekte einlesen soll. Sie verwendet dann schlicht die <b>Accounts<\/b>-Auflistung des <b>BACContact<\/b>-Objekts, um die Liste in der Variablen <b>m_Accounts <\/b>des Typs <b>BACAccounts <\/b>zu speichern:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetBACAccounts(objBACContact<span style=\"color:blue;\"> As <\/span>BACContact)<span style=\"color:blue;\"> As <\/span>BACAccounts\r\n     Return objBACContact.Accounts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wenn der Benutzer im ersten <b>ComboBox<\/b>-Feld mit den Kontakten einen Eintrag ausgew&auml;hlt hat, holen wir mit der folgenden Funktion die Daten zum F&uuml;llen des zweiten <b>ComboBox<\/b>-Feldes zur Anzeige der Konten dieses Kontakts. Dabei verwenden wir auch hier als Parameter das <b>BACContact<\/b>-Element des zu untersuchenden Kontaktes. Die Funktion erstellt als Erstes wieder eine neue ObservableCollection.<\/p>\n<p>In einer <b>For Each<\/b>-Schleife durchlaufen wir diesmal die mit der Funktion <b>GetBACAccounts <\/b>geholten Konten. Innerhalb der <b>For Each<\/b>-Schleife legen wir ein neues Objekt des Typs <b>Account <\/b>an und weisen diesem die Werte f&uuml;r die Eigenschaften <b>AccountNumber<\/b>, <b>AcctName<\/b>, <b>IBAN <\/b>und <b>BIC <\/b>zu sowie einen Verweis auf das <b>BACAccount<\/b>-Objekt dieses Kontos. Anschlie&szlig;end f&uuml;gen wir es der ObservableCollection namens <b>objAccounts <\/b>zu, die wir als Funktionsergebnis zur&uuml;ckliefern:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetAccounts(objBACContact<span style=\"color:blue;\"> As <\/span>BACContact)<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Account)\r\n     <span style=\"color:blue;\">Dim <\/span>objAccounts<span style=\"color:blue;\"> As <\/span>ObservableCollection(Of Account)\r\n     <span style=\"color:blue;\">Dim <\/span>objAccount<span style=\"color:blue;\"> As <\/span>Account\r\n     <span style=\"color:blue;\">Dim <\/span>objBACAccount<span style=\"color:blue;\"> As <\/span>BACAccount\r\n     objAccounts = <span style=\"color:blue;\">New<\/span> ObservableCollection(Of Account)\r\n     For Each objBACAccount In GetBACAccounts(objBACContact)\r\n         objAccount = <span style=\"color:blue;\">New<\/span> Account\r\n         <span style=\"color:blue;\">With<\/span> objAccount\r\n             .AccountNumber = objBACAccount.AccountNumber\r\n             .AcctName = objBACAccount.AcctName\r\n             .BIC = objBACAccount.BIC\r\n             .IBAN = objBACAccount.IBAN\r\n             .BACAccount = objBACAccount\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         objAccounts.Add(objAccount)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n     Return objAccounts\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Fenster zur Anzeige der Auswahlfelder f&uuml;r Kontakte und Konten<\/b><\/p>\n<p>Das Fenster soll im oberen Bereich zwei <b>ComboBox<\/b>-Elemente zur Auswahl von Kontakten und Konten anzeigen. Im Kontakt-Kombinationsfeld wollen wir die <b>UserID <\/b>und die <b>Bankleitzahl <\/b>anzeigen. Das Konto-Auswahlfeld soll nur die IBAN anzeigen. Die Definition dieser beiden Steuer-elemente sieht wie folgt aus. Als Erstes das <b>ComboBox<\/b>-Element <b>cboContacts<\/b>, das an die Auflistung <b>Contacts <\/b>gebunden ist, die wir gleich noch im Code behind-Modul definieren.<\/p>\n<p>Das <b>ComboBox<\/b>-Element hat au&szlig;erdem ein Attribut f&uuml;r das Ereignis <b>SelectionChanged<\/b>. Da wir zwei Felder im <b>ComboBox<\/b>-Element anzeigen wollen, stellen wir diese in einem <b>ItemTemplate <\/b>und den entsprechenden untergeordneten Elementen wie folgt dar:<\/p>\n<pre>&lt;Label Grid.Column=\"0\" Content=\"Kontakt:\"\/&gt;\r\n&lt;ComboBox x:Name=\"cboContacts\" Grid.Row=\"0\" Grid.Column=\"1\" Width=\"200\"\r\n             ItemsSource=\"{Binding Contacts}\"\r\n             SelectedValuePath=\"UserID\"\r\n             SelectionChanged=\"CboContacts_SelectionChanged\"&gt;\r\n     &lt;ComboBox.ItemTemplate&gt;\r\n         &lt;DataTemplate&gt;\r\n             &lt;TextBlock&gt;\r\n                 &lt;TextBlock.Text&gt;\r\n                     &lt;MultiBinding StringFormat=\"{}{0} {1}\"&gt;\r\n                         &lt;Binding Path=\"UserID\" \/&gt;\r\n                         &lt;Binding Path=\"BankCode\" \/&gt;\r\n                     &lt;\/MultiBinding&gt;\r\n                 &lt;\/TextBlock.Text&gt;\r\n             &lt;\/TextBlock&gt;\r\n         &lt;\/DataTemplate&gt;\r\n     &lt;\/ComboBox.ItemTemplate&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p>Das zweite <b>ComboBox<\/b>-Element f&uuml;r die Konten ist an die Liste <b>Accounts <\/b>gebunden. Sie soll nur das Feld <b>IBAN <\/b>anzeigen und l&ouml;st ebenfalls das Ereignis <b>SelectionChanged <\/b>aus:<\/p>\n<pre>&lt;Label Grid.Column=\"0\" Grid.Row=\"1\" Content=\"Konto:\"\/&gt;\r\n&lt;ComboBox x:Name=\"cboAccounts\" Grid.Row=\"1\" Grid.Column=\"1\" Width=\"200\"\r\n             ItemsSource=\"{Binding Accounts}\"\r\n             SelectedValuePath=\"IBAN\"\r\n             SelectionChanged=\"CboAccounts_SelectionChanged\"\r\n             DisplayMemberPath=\"IBAN\"&gt;\r\n&lt;\/ComboBox&gt;<\/pre>\n<p><b>Code behind-Klasse des Fensters<\/b><\/p>\n<p>Die Code behind-Klasse verwendet die folgenden beiden Namespaces:<\/p>\n<pre>Imports System.Collections.ObjectModel\r\nImports System.ComponentModel<\/pre>\n<p>Au&szlig;erdem implementiert sie die <b>INotifyPropertyChanged<\/b>-Schnittstelle:<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> MainWindow\r\n     Implements INotifyPropertyChanged\r\n     <span style=\"color:blue;\">Public <\/span>Event PropertyChanged<span style=\"color:blue;\"> As <\/span>PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged\r\n     Protected Overridable Sub OnPropertyChanged(propname<span style=\"color:blue;\"> As String<\/span>)\r\n         RaiseEvent PropertyChanged(Me, <span style=\"color:blue;\">New<\/span> PropertyChangedEventArgs(propname))\r\n     End Sub<\/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\/55000212\/\">\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\/55000212?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\/55000212\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"b14c72894d\"\/>\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>Nachdem wir die Funktionen zum Abrufen von Kontost&auml;nden und Ums&auml;tzen sowie f&uuml;r das &Uuml;berweisen programmiert haben, k&ouml;nnen wir uns an den Entwurf einer Benutzeroberfl&auml;che f&uuml;r diese Funktionen begeben. Diese soll kompakte Formulare f&uuml;r die wichtigsten bereits behandelten Onlinebanking-Funktionen enthalten. Dazu geh&ouml;rt die Auswahl von Bankaccount und Konto sowie die Anzeige von Ums&auml;tzen und Kontostand. Dies erledigen wir im Hauptfenster der Anwendung. Ein weiteres Fenster erlaubt dann das Ausf&uuml;hren einer &Uuml;berweisung f&uuml;r das aktuell im Hauptfenster ausgew&auml;hlte Konto. Au&szlig;erdem ben&ouml;tigen wir noch eine Tabelle, mit der wir die abgefragten Umsatzdaten speichern k&ouml;nnen. Diese f&uuml;gen wir per Entity Framework hinzu.<\/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":[662020,66032020,66042020,44000027,44000004],"tags":[],"yst_prominent_words":[],"class_list":["post-55000212","post","type-post","status-publish","format-standard","hentry","category-662020","category-66032020","category-66042020","category-Excel_programmieren","category-Loesungen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000212","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=55000212"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000212\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000212"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}