Problem beim Validieren von Werten in DataGrid

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Problem beim Validieren von Werten in DataGrid

    Hallo allerseits :)

    ich habe ein DataGrid mit mehreren Spalten, die validiert werden wollen. Es sollen aber auch falsche Werte in das Binding der jeweiligen Spalten zurückgeschrieben werden. Also benutze ich ValidationStep="CommittedValue". Hier mal exemplarisch eine Spalte:

    XML-Quellcode

    1. <DataGridTextColumn Header="Interpret" Width="*" Visibility="{Binding Data.Sichtbarkeit, Source={StaticResource proxy}}" EditingElementStyle="{StaticResource txtNoEmptyString}">
    2. <DataGridTextColumn.ElementStyle>
    3. <Style TargetType="TextBlock">
    4. <Setter Property="VerticalAlignment" Value="Center" />
    5. </Style>
    6. </DataGridTextColumn.ElementStyle>
    7. <DataGridTextColumn.Binding>
    8. <Binding Path="Interpret" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
    9. <Binding.ValidationRules>
    10. <viewmodel:NoEmptyStringRule ValidatesOnTargetUpdated="True" ValidationStep="CommittedValue"/>
    11. </Binding.ValidationRules>
    12. </Binding>
    13. </DataGridTextColumn.Binding>
    14. </DataGridTextColumn>


    Der Validator sieht so aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Windows.Controls
    3. Public Class NoEmptyStringRule
    4. Inherits ValidationRule
    5. Public Overrides Function Validate(value As Object, cultureInfo As Globalization.CultureInfo) As ValidationResult
    6. Dim Objekt As String = DirectCast(value, String)
    7. If String.IsNullOrEmpty(Objekt) Then
    8. Return New ValidationResult(False, "Dieses Feld darf nicht leer sein. Bitte fülle etwas ein.")
    9. Else
    10. Return ValidationResult.ValidResult
    11. End If
    12. End Function
    13. End Class


    Ich bekomm dabei immer den Fehler in Zeile 9:

    Das Objekt des Typs "System.Windows.Data.BindingExpression" kann nicht in Typ "System.String" umgewandelt werden.

    Das Komische ist, bei dieser Spalte z.B. funktioniert es ohne Probleme:

    Spoiler anzeigen

    XML-Quellcode

    1. <DataGridTextColumn Header="Track #" Width="65" EditingElementStyle="{StaticResource txtTrackNummer}" Visibility="{Binding Data.Sichtbarkeit, Source={StaticResource proxy}}">
    2. <DataGridTextColumn.ElementStyle>
    3. <Style TargetType="TextBlock">
    4. <Setter Property="VerticalAlignment" Value="Center" />
    5. </Style>
    6. </DataGridTextColumn.ElementStyle>
    7. <DataGridTextColumn.Binding>
    8. <Binding Path="Tracknummer" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
    9. <Binding.ValidationRules>
    10. <viewmodel:TrackNummerRule ValidatesOnTargetUpdated="True" ValidationStep="CommittedValue"/>
    11. </Binding.ValidationRules>
    12. </Binding>
    13. </DataGridTextColumn.Binding>
    14. </DataGridTextColumn>


    VB.NET-Quellcode

    1. Public Class TrackNummerRule
    2. Inherits ValidationRule
    3. Private MainModule As Services.IZentraleKlasse = Services.ServiceContainer.GetService(Of Services.IZentraleKlasse)
    4. Public Overrides Function Validate(value As Object, cultureInfo As Globalization.CultureInfo) As ValidationResult
    5. Dim str As String = TryCast(MainModule.GetBoundValue(value), String)
    6. Dim TrackNr As Integer
    7. If Integer.TryParse(str, TrackNr) Then
    8. If (TrackNr > 0) And (TrackNr < 1000) Then
    9. Return ValidationResult.ValidResult
    10. End If
    11. End If
    12. Return New ValidationResult(False, "Ungültige Tracknummer. Bitte gebe einen Wert von 1-999 ein.")
    13. End Function


    Google spuckt bei mir nur einen Treffer aus, bei stackoverflow, aber dort ist die Frage auch nicht beantwortet...

    Jemand ne Idee was da los ist??

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()