Guten Morgen
ich hab mal eine ganz kurze Frage:
Und zwar hab ich eine Liste mit Datensätzen in einem DataGrid. Auf manche der Spalten wende ich ValidationRules an:
Spoiler anzeigen
Spoiler anzeigen
Jetzt hab ich noch einen Button zum Speichern der Datensätze. Ich möchte, dass, wenn ich irgendwo im DataGrid einen ungültigen Wert eingebe, das Speichern nicht möglich ist.
Also hab ich mir eine Funktion geschrieben, die beim Klick des Buttons ausgeführt wird:
Spoiler anzeigen
Blöd ist nur, dass wenn ich einen falschen Wert eingebe, die Funktion trotzdem immer True zurückgibt weil, ich hab es getestet, der falsche Wert nicht zurückgeschrieben wird in die
Gibt es da evtl. eine Property oder sowas, die das verhindert. Oder beziehungsweise wie würdet ihr das lösen?
Edit: Habs gefunden, lag an der ValidationStep Property:
Danach hatte ich noch einen Konvertierungsfehler, da hab ich das hier noch geändert (zweiter Spoiler):
Edit2:
Und dann ist noch ein Problem aufgetaucht:
Die Cells im DataGrid wurden rot umrandet, obwohl der Wert valid war. Nach Stunden der Recherche hab ich dann auch dafür eine Lösung gefunden:
Spoiler anzeigen
Und der Aufruf der Konvertierung in der
ich hab mal eine ganz kurze Frage:
Und zwar hab ich eine Liste mit Datensätzen in einem DataGrid. Auf manche der Spalten wende ich ValidationRules an:
XML-Quellcode
- <DataGridTextColumn Header="Track #" Width="60" EditingElementStyle="{StaticResource txtTrackNummer}">
- <DataGridTextColumn.Binding>
- <Binding Path="Tracknummer" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
- <Binding.ValidationRules>
- <viewmodel:TrackNummerRule ValidatesOnTargetUpdated="True"/>
- </Binding.ValidationRules>
- </Binding>
- </DataGridTextColumn.Binding>
- </DataGridTextColumn>
VB.NET-Quellcode
- Public Class TrackNummerRule
- Inherits ValidationRule
- Public Overrides Function Validate(value As Object, cultureInfo As Globalization.CultureInfo) As ValidationResult
- Dim TrackNr As Integer
- If Integer.TryParse(CType(value, String), TrackNr) Then
- If (TrackNr > 0) And (TrackNr < 1000) Then
- Return ValidationResult.ValidResult
- End If
- End If
- Return New ValidationResult(False, "Ungültige Tracknummer. Bitte gebe einen Wert von 1-999 ein.")
- End Function
- End Class
Jetzt hab ich noch einen Button zum Speichern der Datensätze. Ich möchte, dass, wenn ich irgendwo im DataGrid einen ungültigen Wert eingebe, das Speichern nicht möglich ist.
Also hab ich mir eine Funktion geschrieben, die beim Klick des Buttons ausgeführt wird:
VB.NET-Quellcode
- Public Function ValidateMetaData(argTitelListe As List(Of ViewModel.MP3FileInfoVM)) As Boolean Implements IChangeMetaData.ValidateMetaData
- For Each Eintrag In argTitelListe
- If Not (TrackNummerValidator.Validate(Eintrag.Tracknummer, Nothing) = ValidationResult.ValidResult) Then
- Return False
- End If
- '[usw. mit den anderen Spalten...]
- Next
- Return True
- End Function
Blöd ist nur, dass wenn ich einen falschen Wert eingebe, die Funktion trotzdem immer True zurückgibt weil, ich hab es getestet, der falsche Wert nicht zurückgeschrieben wird in die
TitelListe
, sondern nur der letzte richtige, weil das die Validation verhindert.Gibt es da evtl. eine Property oder sowas, die das verhindert. Oder beziehungsweise wie würdet ihr das lösen?
Edit: Habs gefunden, lag an der ValidationStep Property:
Danach hatte ich noch einen Konvertierungsfehler, da hab ich das hier noch geändert (zweiter Spoiler):
Edit2:
Und dann ist noch ein Problem aufgetaucht:
Die Cells im DataGrid wurden rot umrandet, obwohl der Wert valid war. Nach Stunden der Recherche hab ich dann auch dafür eine Lösung gefunden:
VB.NET-Quellcode
- Private Function GetBoundValue(ByVal value As Object) As Object
- If TypeOf value Is BindingExpression Then
- Dim binding As BindingExpression = CType(value, BindingExpression)
- Dim resolvedPropertyName As String = binding.[GetType]().GetProperty("ResolvedSourcePropertyName", BindingFlags.[Public] Or BindingFlags.DeclaredOnly Or BindingFlags.Instance).GetValue(binding, Nothing).ToString()
- Dim resolvedSource As Object = binding.[GetType]().GetProperty("ResolvedSource", BindingFlags.[Public] Or BindingFlags.DeclaredOnly Or BindingFlags.Instance).GetValue(binding, Nothing)
- Dim propertyValue As Object = resolvedSource.[GetType]().GetProperty(resolvedPropertyName).GetValue(resolvedSource, Nothing)
- Return propertyValue
- Else
- Return value
- End If
- End Function
Und der Aufruf der Konvertierung in der
Function Validate
so, z.B. für einen String:Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „kafffee“ ()