{"id":55000179,"date":"2019-04-01T00:00:00","date_gmt":"2020-03-27T19:37:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=179"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Access_zu_WPF_Validierung_und_Navigation","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Access_zu_WPF_Validierung_und_Navigation\/","title":{"rendered":"Access zu WPF: Validierung und Navigation"},"content":{"rendered":"<p><b>Im Artikel &#8220;Access zu WPF: Detailformulare mit Combo, Checkbox und Button&#8221; haben wir gezeigt, wie Sie die in Formularen enthaltenen gebundenen Steuer-elemente wie Kombinationsfelder und Kontrollk&auml;stchen sowie Schaltfl&auml;chen in WPF-Fenster &uuml;bertragen. In diesem Artikel wollen wir uns ansehen, wie Sie einem WPF-Fenster auf Basis eines Access-Detailformulars eine Validierung und Navigationsschaltfl&auml;chen hinzuf&uuml;gen. Die notwendigen Techniken haben wir bereits im Artikel &#8220;EDM: Bl&auml;ttern in Datens&auml;tzen&#8221; vorgestellt, nun integrieren wir diese in unsere VBA-Prozedur zum Erstellen des Codes f&uuml;r ein WPF-Fenster mit Navigationsschaltfl&auml;chen.<\/b><\/p>\n<p>Um festzulegen, ob ein Formular mit oder ohne Validierung und Navigationsschaltfl&auml;chen erstellt werden soll, f&uuml;gen wir der Prozedur <b>FormularNachWPF <\/b>zwei weitere Parameter hinzu:<\/p>\n<ul>\n<li><b>bolValidation<\/b>: Gibt an, ob die Validierung hinzugef&uuml;gt werden soll.<\/li>\n<li><b>bolNavigation<\/b>: Gibt an, ob die Navigationsschaltfl&auml;chen hinzugef&uuml;gt werden sollen.<\/li>\n<\/ul>\n<p>Die Validierung f&uuml;r einen neuen, leeren Datensatz sieht dann etwa wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_179_002.png\" alt=\"Validierung bei einem neuen, leeren Datensatz\" width=\"349,7625\" height=\"317,118\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Validierung bei einem neuen, leeren Datensatz<\/span><\/b><\/p>\n<p>Die Prozedur <b>FormularNachWPF <\/b>erweitern wir an den folgenden Stellen um die Entgegennahme beziehungsweise &Uuml;bergabe der Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FormularNachWPF(strForm<span style=\"color:blue;\"> As String<\/span>, strTabelle<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolValidation<span style=\"color:blue;\"> As Boolean<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> bolNavigation<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     ... \r\n     lngHeight = TwipsToPixelsHeight(frm.Section(0).Height) + 30\r\n     <span style=\"color:blue;\">If <\/span>bolNavigation = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         lngTopNavi = lngHeight - 30\r\n         lngHeight = lngHeight + 28\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Bei der Definition des <b>Window<\/b>-Elements f&uuml;gen wir noch das Ereignisattribut <b>Closing <\/b>mit dem Wert <b>Window_Closing <\/b>hinzu, welches sicherstellt, dass das Fenster nur bei ge&auml;ndertem und gespeichertem Datensatz geschlossen werden kann:<\/p>\n<pre>     strXAML = strXAML & \"&lt;Window x:Class=\"\"\" & frm.Name & \"\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     ...\r\n     strXAML = strXAML & \"        Title=\"\"\" & strTitle & \"\"\" Height=\"\"\" & lngHeight & \"\"\" Width=\"\"\" & lngWidth _\r\n         & \"\"\" Closing=\"\"Window_Closing\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>F&uuml;r die folgenden Aufruf haben wir die &Uuml;bergabe der Parameter bolValidation und bolNavigation erweitert:<\/p>\n<pre>     ...\r\n     AttributeHinzufuegen frm, strXAML, bolValidation, bolNavigation\r\n     ...\r\n     SteuerelementeHinzufuegen frm, strXAML, strTabelle, colMappings, bolValidation, bolNavigation\r\n     <span style=\"color:blue;\">If <\/span>bolNavigation<span style=\"color:blue;\"> Then<\/span>\r\n         NavigationHinzufuegen strXAML, lngTopNavi\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Erweiterung der Prozedur AttributeHinzufuegen<\/h2>\n<p>Die XAML-Datei enth&auml;lt mit eingebauter Validierung einige Zeilen Code mehr. Diesem werden wir in der Prozedur <b>AttributeHinzufuegen <\/b>wie folgt gerecht, die ebenfalls die beiden Parameter <b>bolValidation <\/b>und <b>bolNavigation <\/b>erwartet:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AttributeHinzufuegen(frm<span style=\"color:blue;\"> As <\/span>Form, strXAML<span style=\"color:blue;\"> As String<\/span>, bolValidation<span style=\"color:blue;\"> As Boolean<\/span>, bolNavigation<span style=\"color:blue;\"> As Boolean<\/span>)<\/pre>\n<p>In dieser Prozedur geht es allein um das Zusammenstellen allgemeiner Properties f&uuml;r Steuerelemente im <b>WindowResources<\/b>-Bereich. Da wir hier auch die Steuer-elemente durchlaufen, um die <b>DataTrigger <\/b>und <b>MultiDataTrigger <\/b>f&uuml;r die Validierung zu definieren, ben&ouml;tigen wir eine Variable namens <b>ctl <\/b>mit dem Typ <b>Control<\/b>:<\/p>\n<pre>     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control<\/pre>\n<p>Danach geht es dann direkt rund. Wir pr&uuml;fen, ob <b>bolValidation <\/b>den Wert <b>True<\/b> aufweist und f&uuml;gen dann die Vorlage f&uuml;r die Markierung nicht erfolgreich validierter Steuer-elemente hinzu:<\/p>\n<pre>     strXAML = strXAML & \"        &lt;Window.Resources&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolValidation<span style=\"color:blue;\"> Then<\/span>\r\n         strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type FrameworkElement}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"Validation.ErrorTemplate\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;Setter.Value&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;ControlTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                        &lt;DockPanel&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                            &lt;Border Background=\"\"Red\"\" DockPanel.Dock=\"\"right\"\" \" _\r\n             & \"Margin=\"\"5,0,0,0\"\" Width=\"\"20\"\" Height=\"\"20\"\" CornerRadius=\"\"10\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                                ToolTip=\"\"{Binding ElementName=customAdorner, \" _\r\n             & \"Path=AdornedElement.(Validation.Errors)[0].ErrorContent}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                                &lt;TextBlock Text=\"\"!\"\" VerticalAlignment=\"\"center\"\" \" _\r\n             & \"HorizontalAlignment=\"\"center\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                                   FontWeight=\"\"Bold\"\" Foreground=\"\"white\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                            &lt;\/Border&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                            &lt;AdornedElementPlaceholder Name=\"\"customAdorner\"\" \" _\r\n             & \"VerticalAlignment=\"\"Center\"\" &gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                                &lt;Border BorderBrush=\"\"red\"\" BorderThickness=\"\"1\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                            &lt;\/AdornedElementPlaceholder&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                        &lt;\/DockPanel&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;\/ControlTemplate&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;\/Setter.Value&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...<\/pre>\n<p>Der n&auml;chste Teil, der nur von der Notwendigkeit einer Validierung abh&auml;ngt, sind die Elemente <b>ComboBox <\/b>und <b>TextBox<\/b>, die wir beide mit den <b>Style<\/b>-Attributen f&uuml;r die Validierung ausstatten m&uuml;ssen &#8211; also mit dem soeben angelegten Style. Dazu pr&uuml;fen wir wieder per <b>If&#8230;Then<\/b>-Bedingung, ob <b>bolValidation <\/b>den Wert <b>True <\/b>aufweist, und f&uuml;gen dann eine der beiden Zeilen als erste Zeile des Styles hinzu:<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">With<\/span> frm.DefaultControl(acTextBox)\r\n         <span style=\"color:blue;\">If <\/span>bolValidation<span style=\"color:blue;\"> Then<\/span>\r\n             strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type TextBox}\"\" \"_\r\n                 & \"BasedOn=\"\"{StaticResource {x:Type FrameworkElement}}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type TextBox}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         ...\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">With<\/span> frm.DefaultControl(acComboBox)\r\n         <span style=\"color:blue;\">If <\/span>bolValidation<span style=\"color:blue;\"> Then<\/span>\r\n             strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type ComboBox}\"\" \" _\r\n                 & \"BasedOn=\"\"{StaticResource {x:Type FrameworkElement}}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strXAML = strXAML & \"        &lt;Style TargetType=\"\"{x:Type ComboBox}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         ...\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     ...<\/pre>\n<p>Mit dem <b>BasedOn<\/b>-Attribut sorgen wir daf&uuml;r, dass der oben definierte, f&uuml;r den Typ <b>FrameworkElement <\/b>vorgesehene Style sowohl an <b>ComboBox<\/b>&#8211; als auch <b>TextBox<\/b>-Elemente vererbt wird. Durch das Erfassen der Attribute f&uuml;r die Markierung nicht erfolgreich validierter Steuer-elemente in einem eigenen <b>Style<\/b>-Element sparen wir einige Zeilen Code, da wir die gleichen Elemente nicht f&uuml;r beide Steuerelementtypen einzeln hinterlegen m&uuml;ssen.<\/p>\n<p>Erst wollten wir auch das <b>CheckBox<\/b>-Element auf diese Weise ausstatten, aber dieses ist ja ohnehin meist mit dem Wert <b>False <\/b>vorbelegt, sodass keine Validierung notwendig ist.<\/p>\n<p>Danach stellen wir die <b>DataTrigger<\/b>-Elemente f&uuml;r drei Steuerelementtypen <b>ComboBox<\/b>, <b>TextBox <\/b>und <b>CheckBox <\/b>zusammen, die daf&uuml;r sorgen, dass die Eigenschaft <b>IsEnabled<\/b>, die wir sp&auml;ter im Code behind-Modul definieren, f&uuml;r die mit diesem <b>DataTrigger <\/b>ausgestatteten Style auf <b>False <\/b>eingestellt wird, wenn die Validierung auch nur f&uuml;r ein einziges der Steuer-elemente fehlschl&auml;gt. Dies betrifft etwa die Schaltfl&auml;chen zum Navigieren, die wir sp&auml;ter hinzuf&uuml;gen. Hier verwenden wir zum ersten Mal die Variable <b>ctl<\/b>, mit der wir in einer <b>For Each<\/b>-Schleife alle Steuer-elemente des Formulars durchlaufen. Damit f&uuml;gen wir dem <b>Style<\/b>-Element, das wir &uuml;ber das Attribut <b>x:Key <\/b>mit dem Wert <b>EnableOnValidation <\/b>identifizieren, f&uuml;r jedes Steuer-element drei Zeilen hinzu, die das <b>DataTrigger<\/b>-Element mit der Bedingung und das <b>Setter<\/b>-Element mit dem zu setzenden Wert enthalten:<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">If <\/span>bolValidation<span style=\"color:blue;\"> Then<\/span>\r\n         strXAML = strXAML & \"        &lt;Style x:Key=\"\"EnableOnValidation\"\" TargetType=\"\"{x:Type Button}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         For Each ctl In frm.Controls\r\n             Select Case ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acComboBox, acCheckBox, acTextBox\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(ctl.ControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                         strXAML = strXAML & \"                &lt;DataTrigger Binding=\"\"{Binding ElementName=\" & ctl.Name _\r\n                             & \", Path=(Validation.HasError)}\"\" Value=\"\"True\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                         strXAML = strXAML & \"                    &lt;Setter Property=\"\"IsEnabled\"\" \" _\r\n                             & \"Value=\"\"False\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                         strXAML = strXAML & \"                &lt;\/DataTrigger&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> ctl\r\n         strXAML = strXAML & \"            &lt;\/Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n...<\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch jeweils ein <b>MultiDataTrigger<\/b>-Element f&uuml;r jedes gebundene Steuer-element der Typen <b>ComboBox<\/b>, <b>TextBox <\/b>und <b>CheckBox<\/b>. Dieses liefert standardm&auml;&szlig;ig f&uuml;r das Attribut <b>IsEnabled <\/b>den Wert <b>True<\/b>. Wenn alle in den <b>Condition<\/b>-Elementen genannten Bedingungen wahr sind, also die Validierung f&uuml;r alle Elemente keinen Fehler liefert, wird <b>IsEnabled <\/b>auf <b>False <\/b>eingestellt. Dieser mit dem Schl&uuml;ssel <b>EnableOnFailedValidation <\/b>benannte Style wird f&uuml;r die <b>R&uuml;ckg&auml;ngig<\/b>-Schaltfl&auml;che eingesetzt, um diese nur zu aktivieren, wenn mindestens eine Validierung fehlschl&auml;gt und diese nur zu deaktivieren, wenn alle Validierungen erfolgreich waren. Auch hier durchlaufen wir in einer <b>For Each<\/b>-Schleife alle gebundenen Steuerelemente:<\/p>\n<pre>...\r\n         strXAML = strXAML & \"        &lt;Style x:Key=\"\"EnableOnFailedValidation\"\" TargetType=\"\"{x:Type Button}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Setter Property=\"\"IsEnabled\"\" Value=\"\"True\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;MultiDataTrigger&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;MultiDataTrigger.Conditions&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         For Each ctl In frm.Controls\r\n             Select Case ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acComboBox, acCheckBox, acTextBox\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(ctl.ControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                         strXAML = strXAML & \"                        &lt;Condition Binding=\"\"{Binding ElementName=\" _\r\n                             & ctl.Name & \", Path=(Validation.HasError)}\"\" Value=\"\"False\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> ctl\r\n         strXAML = strXAML & \"                    &lt;\/MultiDataTrigger.Conditions&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;Setter Property=\"\"IsEnabled\"\" Value=\"\"False\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;\/MultiDataTrigger&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;\/Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Sollen die Navigationsschaltfl&auml;chen angezeigt werden, brauchen wir auch noch diese beiden <b>Style<\/b>-Elemente, die daf&uuml;r sorgen, dass die Schaltfl&auml;che <b>btnErster <\/b>und <b>btnVorheriger<\/b>, die wir nachfolgend hinzuf&uuml;gen, nur aktiviert werden, wenn gerade nicht der erste Datensatz angezeigt wird. Genauso sollen die Schaltfl&auml;chen <b>btnNaechster <\/b>und <b>btnLetzter <\/b>nur aktiviert werden, wenn gerade nicht der letzte Datensatz angezeigt wird. Dazu weisen wir den Schaltfl&auml;chen die folgenden <b>Style<\/b>-Elemente zu, die wiederum auf den <b>Style<\/b>-Elementen <b>EnableOnValidation <\/b>basieren:<\/p>\n<pre>    <span style=\"color:blue;\">If <\/span>bolNavigation = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strXAML = strXAML & \"            &lt;Style x:Key=\"\"ButtonVorheriger\"\" BasedOn=\"\"{StaticResource EnableOnValidation}\"\" TargetType=\"\"{x:Type Button}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;DataTrigger Binding=\"\"{Binding ErsterKunde}\"\" Value=\"\"False\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;Setter Property=\"\"IsEnabled\"\" Value=\"\"False\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;\/DataTrigger&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;\/Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;Style x:Key=\"\"ButtonNaechster\"\" BasedOn=\"\"{StaticResource EnableOnValidation}\"\" TargetType=\"\"{x:Type Button}\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;DataTrigger Binding=\"\"{Binding LetzterKunde}\"\" Value=\"\"False\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                    &lt;Setter Property=\"\"IsEnabled\"\" Value=\"\"False\"\"&gt;&lt;\/Setter&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"                &lt;\/DataTrigger&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"            &lt;\/Style.Triggers&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXAML = strXAML & \"        &lt;\/Style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/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\/55000179\/\">\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\/55000179?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\/55000179\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"dbce743e9d\"\/>\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;Access zu WPF: Detailformulare mit Combo, Checkbox und Button&#8221; haben wir gezeigt, wie Sie die in Formularen enthaltenen gebundenen Steuer-elemente wie Kombinationsfelder und Kontrollk&auml;stchen sowie Schaltfl&auml;chen in WPF-Fenster &uuml;bertragen. In diesem Artikel wollen wir uns ansehen, wie Sie einem WPF-Fenster auf Basis eines Access-Detailformulars eine Validierung und Navigationsschaltfl&auml;chen hinzuf&uuml;gen. Die notwendigen Techniken haben wir bereits im Artikel &#8220;EDM: Bl&auml;ttern in Datens&auml;tzen&#8221; vorgestellt, nun integrieren wir diese in unsere VBA-Prozedur zum Erstellen des Codes f&uuml;r ein WPF-Fenster mit Navigationsschaltfl&auml;chen.<\/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":[66022019,662019,44000002,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000179","post","type-post","status-publish","format-standard","hentry","category-66022019","category-662019","category-Benutzeroberflaeche_mit_WPF","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000179","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=55000179"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000179\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000179"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}