Autor Beitrag
RobAll
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Fr 15.10.21 20:27 
Guten Abend,

bei einer WPF Textbox validiere ich eine Laufzeit in Tagen als Integer.
ValidationLaufzeit größer, kleiner die Error Meldungen werden bereitgestellt, und ich kann im ViewModel mit HasError und CanExecute die Fehler managen.

Nun gebe ich aus Versehen einen String ein.
Meldung:
der Wert xxx konnte nicht konvertiert werden
um das Textfeld wird ein roter Rahmen angezeigt.

Ich benötige den ERROR jetzt im View Model für den CanExecute im HasError, dieser wird aber nicht durchgereicht.
Wie kann ich das Problem lösen?

Habt ihr da eine Lösung?
Danke vorab
Viele Grüße

RobAll

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<TextBox Grid.Row="3" Grid.Column="1" Name ="Laufzeit" Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
    <Binding Path="Laufzeit" UpdateSourceTrigger="PropertyChanged" >
        <Binding.ValidationRules>
            <NotifyDataErrorValidationRule/>
        </Binding.ValidationRules>
    </Binding>
</TextBox>


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Moderiert von user profile iconTh69: XML-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 16.10.21 09:36 
Hallo,

bei einem Fehler sollten ErrorsChanged sowie GetErrors dafür aufgerufen werden.
Du kannst dir auch mal WPF Validation - Using INotifyDataErrorInfo als Beispiel dafür ansehen.

Einen kompletten Überblick über WPF-Validation gibt u.a. Validation in WPF (s. bes. "Validation Processing" sowie "INotifyDataErrorInfo").

PS:
RobAll hat folgendes geschrieben:
ValidationLaufzeit größer, kleiner die Error Meldungen werden bereitgestellt

Dies ist leider unverständlich - könntest du das noch mal genauer erklären?!
RobAll Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Sa 16.10.21 10:22 
Hallo Th69,

ich habe genau dieses Beispiel aus deinem Link verwendet :D


"ValidationLaufzeit größer, kleiner die Error Meldungen werden bereitgestellt"


Problem im Datenfeld Integer "Restlaufzeit"
Die Validierung funktioniert einwandfrei im Datentyp Integer,
Nur wenn ich dort "aus versehen" einen String eingebe bekomme ich den Error =>

"der Wert xxx konnte nicht konvertiert werden"

weil ein Integer als Eingabewert erwartet wird.

Im ViewModel wird der Has Error nicht getriggert, weil der Fehler vorher schon in der View abgefangen wird.
Ich benötige den Has Error im ViewModel für einen CanExecute Command.

Da bräuchte ich einen Lösungsansatz.

Danke vorab
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 16.10.21 11:52 
Du meinst, der Fehler wird nicht an deine INotifyDataErrorInfo-Implementierung weitergereicht?
Dann schau mal in meinen 2. Link unter "Type Conversion" bzgl. Validation.Error.

PS: Ich verstehe deinen Satz immer noch nicht - das ist einfach kein grammatikalisch korrektes Deutsch!
Was meinst du mit "größer, kleiner"?
RobAll Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Sa 16.10.21 12:10 
Bei der Datenfeld Validierung eines Integers funktioniert INotifyDataErrorInfo einwandfrei.
ausblenden C#-Quelltext
1:
2:
if (Laufzeit < 7 || Laufzeit > 365
  AddError(nameof(Laufzeit), "Fehler...");

Zitat:
Du meinst, der Fehler wird nicht an deine INotifyDataErrorInfo-Implementierung weitergereicht?
Dann schau mal in meinen 2. Link unter "Type Conversion" bzgl. Validation.Error.

Richtig.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 16.10.21 12:43 
Zur Erklärung: Wenn die Benutzereingabe nicht in den passenden Datentyp (bei dir jetzt z.B. int) umgewandelt werden kann, so kann ja auch nicht die Eigenschaft gesetzt werden und somit muß dieser Fehler anders behandelt werden.

Möchtest du das trotzdem direkt behandeln, so müßtest du stattdessen eine String-Eigenschaft verwenden und die passende Umwandlung selber in deinem ViewModel vornehmen.

PS: Jetzt habe ich zumindestens den Sinn deines Satzes verstanden - auch wenn dieser immer noch Murks ist...