none
Wie kann ich eine Rückmeldung über Eingabeformat-Fehler für die Validierung erhalten?

    Frage

  • Hi Leute,

    wenn ich in einer Int-Gebunden-TextBox Text eingebe, validiert die UI selbständig und markiert zu Recht das ungültige Format und gibt diesen Wert logischerweise nicht weiter an die gebundene Property.

    Mein gebundenes Objekt implementiert u. a. INotifyDataErrorInfo und in diesem Zusammenhang nutze ich HasErrors in meinem ViewModel um das Save-Command zu deaktivieren.

    Wenn es zum Property-Update aus Binding-Objekt kommt, greifen die Validierungsregeln in meinem Model und mein Save-Button wird deaktiviert. Nur wie gesagt wenn in der UI Typen-Falsche Angaben gemacht werden (z.b. string, int benötigt) greifen Validierungsregeln nicht im Model und der Save-Button bleibt enabled.

    Was ich vermeiden wollte wäre eine Lösung mit einem Converter. Evtl. so eine Art IsValid-Bindung von der View zum ViewModel, oder auch jede andere einfach / elegante Lösung?

    Grüsse
    Attila

    Montag, 25. März 2013 10:23

Antworten

  • Hi,
    Du hast richtig verstanden, dass die Eigenschaften eines ViewModels an Steuerelemente der Oberfläche gebunden werden können. Da es sich aber um eine späte Bindung handelt, kannst Du auch nicht typgerecht binden. Damit überlässt Du aber den Konvertierungsprozess der Laufzeitumgebung. Wenn Du Fehler in diesem Konvertierungsprozess auswerten willst, musst Du Dich entsprechend Deinen Optionen in diesen Prozess hineinhängen. Da kannst Du beispielsweise eine TextBox herleiten, die bei nichtnumerischer Eingabe deaktiviert wird. Was “Deaktivieren” bedeutet, musst Du dann aber selbst festlegen.
     
    --
    Peter Fleischer
    • Als Antwort markiert eolíth Sonntag, 7. April 2013 12:17
    Freitag, 29. März 2013 17:10

Alle Antworten

  • Hi,
    da die Text-Eigenschaft der TextBox vom Typ String ist, kannst Du die Eigenschaft im ViewModel, die gebunden wird auch vom Typ String deklarieren. Die Typkonvertierung führst Du im Getter und Setter aus. Im Setter kannst Du dann die Prüfung durchführen und entsprechend reagieren.
     
    --
    Peter Fleischer
    Dienstag, 26. März 2013 12:54
  • Hi Peter,

    sry für die späte Antwort und danke für das Feedback. So richtig gut anfühlen tut sich die Lösung nicht. Ich mag nicht alles auf Strings auslegen, dafür gibt es zuviel schöne Typen ^^ nur um der WPF-Anwendung gefällig zu werden.

    Ich werde weiter forschen.

    Grüsse Attila

    Donnerstag, 28. März 2013 22:14
  • Hi,
    die Text-Eigenschaft der TextBox ist vom Typ String. Du bindest eine Eigenschaft vom Typ Integer und überlässt die Typkonvertierung der Laufzeitumgebung. Damit überlässt Du aber auch die Fehlerbehandlung der Laufzeitumgebung.
     
    Mein Vorschlag war, typsicher zu arbeiten und die Konvertierung selbst auszuführen. Damit behältst Du die volle Kontrolle, Ich verstehe nicht, was sich an Typsicherheit nicht gut anfühlen soll. Die schönen Typen bleiben Dir voll erhalten. Du übernimmst lediglich die Steuerung über die Typkonvertierung selbst und entscheidest, wie im Fehlerfall zu verfahren ist.
     
    --
    Peter Fleischer
    Freitag, 29. März 2013 03:41
  • Hi,

    soweit ich das MVVM-Muster bis jetzt verstanden habe, kann ich meine Model-Objekt direkt über das ViewModel an die View binden. Mein Businnessobjekt alias Modelobjekt sieht eine Property vom Typ int vor auf das sich andere Komponenten und Deinste beziehen und nur wegen der View-TextBox in der gesamten Applikation nicht abgeändert werde soll.

    Mein Frag war einfach nur die, ob es in der View die Möglichkeit gibt auf reiner View-Schicht-Eben eine UIElement zu deaktivieren, wenn die Bindung Fehler enthält ?

    Das wäre einfach gewesen, aber so bleiben mir dann z. Zt. folgende Optionen:

    ODER: Businnessobjekt.Property von string zu int umbauen.

    ODER: Mein Model-Objekt im ViewModel kappseln um dort ein Mapping zwischen string<>int zu betreiben.

    ODER: Mit einem Converter arbeiten der z. B. null zurückgibt und die Property vom Typ int? ist.

    ODER: Eine class IntTextBox:TextBox {}


    • Bearbeitet eolíth Freitag, 29. März 2013 12:11
    Freitag, 29. März 2013 12:11
  • Hi,
    Du hast richtig verstanden, dass die Eigenschaften eines ViewModels an Steuerelemente der Oberfläche gebunden werden können. Da es sich aber um eine späte Bindung handelt, kannst Du auch nicht typgerecht binden. Damit überlässt Du aber den Konvertierungsprozess der Laufzeitumgebung. Wenn Du Fehler in diesem Konvertierungsprozess auswerten willst, musst Du Dich entsprechend Deinen Optionen in diesen Prozess hineinhängen. Da kannst Du beispielsweise eine TextBox herleiten, die bei nichtnumerischer Eingabe deaktiviert wird. Was “Deaktivieren” bedeutet, musst Du dann aber selbst festlegen.
     
    --
    Peter Fleischer
    • Als Antwort markiert eolíth Sonntag, 7. April 2013 12:17
    Freitag, 29. März 2013 17:10