Überprüfen mittels ValidationRule forcieren

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Überprüfen mittels ValidationRule forcieren

    Hallo miteinander :)

    ich habe ein kleines Problem, und zwar hab ich ein DataGrid mit einer Custom-Spalte mit einer Textbox drin:

    XML-Quellcode

    1. <DataGrid Name="dgrdAudioDateien" ItemsSource="{Binding TitelListe, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" IsReadOnly="False" HeadersVisibility="Column" SelectionMode="Single" CanUserAddRows="False">
    2. <DataGridTemplateColumn Header="DateiName/URL" Width="*">
    3. <DataGridTemplateColumn.CellTemplate>
    4. <DataTemplate>
    5. <TextBox>
    6. <Binding Path="GenFN" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
    7. <Binding.ValidationRules>
    8. <viewmodel:DateiNameValidationRule/>
    9. </Binding.ValidationRules>
    10. </Binding>
    11. </TextBox>
    12. </DataTemplate>
    13. </DataGridTemplateColumn.CellTemplate>
    14. </DataGridTemplateColumn>
    15. ​...
    16. </DataGrid>


    VB.NET-Quellcode

    1. Imports System.Globalization
    2. Imports System.Windows.Controls
    3. Public Class DateiNameValidationRule
    4. Inherits ValidationRule
    5. Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
    6. For Each character In System.IO.Path.GetInvalidFileNameChars
    7. If value.ToString.Contains(character) Then
    8. Return New ValidationResult(False, "Der Dateiname enthält mindestens ein ungültiges Zeichen.")
    9. End If
    10. Next
    11. End Function
    12. End Class


    Die Inhalte der Textboxen will ich validieren, so dass der User keine ungültigen Dateinamenzeichen eingeben kann.

    Funktioniert auch soweit ganz gut, bei einem ungültigen Zeichen werden die Textboxen rot umrandet, aber erst wenn der Benutzer händisch was ändert. Wenn jedoch beim initialisieren des modalen Dialogs mit dem DataGrid drin schon unerwünschte Zeichen drin sind (in TitelListe.GenFN), dann werden die Textboxen nicht rot umrandet.

    Gibt es eine Möglichkeit, die Validation Rules zu forcieren oder hat jemand eine Idee, wie ich dem zu Leibe rücken kann?

    Freu mich auf Eure Antworten :)
    Solange du die Property setzt (also über den Setter) und das Binding bereits aktiv ist, müsste die Validierung auch dann greifen
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Jou explizit gesetzt wird da nichts, zumindest nicht die Property GenFN... TitelListe ist eine ObservableCollection (of CustomClass), die an das DataGrid gebunden ist. Wenn der Dialog geladen wird, wird über den Constructor die OC übergeben und TitelListe gesetzt. Wenn man irgendwie von außerhalb RaisePropertyChanged aufrufen könnte...
    Ich würde das komplett anders machen. Ich gestatte es Usern nie direkt selbst Dateinamen einzutippen. Ich nutze grundsätzlich die dafür vorgesehenen Dialoge. So ist es nicht möglich, das überhaupt so ein Problem entsteht.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @DTF

    Mach ich prinzipiell auch, bloss hier möchte ich dem User die Option geben, die Dateinamen zu ändern. Bisher hatte ich es so, dass ich die ungültigen Zeichen einfach ohne den User zu fragen durch ein Plus ersetzt hab, nach einiger Überlegung ist das ja dann aber auch nicht Sinn der Sache und könnte für Verwirrung sorgen....

    PS: Hab dich nicht vergessen, bei meinem Projekt sind dann aber doch noch an die 2000 Zeilen Code dazu gekommen inkl. Installer, ich melde mich dann wenn ich soweit bin :)

    kafffee schrieb:

    Mach ich prinzipiell auch, bloss hier möchte ich dem User die Option geben, die Dateinamen zu ändern.


    Wo ist das Problem? SaveFileDialog nutzen->Dateiname festelegen lassen->Datei kopieren>alte Datei löschen, feddich. Oder File.Move statt kopieren. Ich mach da erst gernicht so ein gefummel, genau für sowas sind die Dialoge da.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DTF schrieb:

    Wo ist das Problem?


    Mein Programm sammelt alle Musiktitel eines Albums und zeigt sie in dem DataGrid an, also Dateiname, Interpret, Album, Titel, etc.. Dabei gibt es die Option, sich die Dateinamen nach vorher festgelegten Regeln (z.B. "%Interpret% - %Titel%.mp3") generieren zu lassen, damit der User nicht für jeden Track einzeln da die Dateinamen eintippen muss.

    Hab mir mal Gedanken gemacht und mache es jetzt so, dass ich eine Kombination aus Beidem machen werde. Also erstmal die ungültigen Zeichen durch ein "+" ersetzen, und wenn der User dann noch was ändern will, kann er das, wird aber durch die rot umrandeten TextBoxen darauf hingewiesen werden, dass die Dateinamen invalid sind.

    Wenn sich meine User dann daran stören kann ich immer noch diesen Workaround benutzen (ist mir gestern Abend noch eingefallen, das würde wahrscheinlich funktionieren):

    Anstatt die OC als Ganzes zu übergeben, einfach so:

    VB.NET-Quellcode

    1. Private TitelListe As New List(Of MP3FileInfo)
    2. For Each AudioFile in argTitelListe
    3. TitelListe.Add(New MP3FileInfo(AudioFile.DateiName, AudioFile.Intgerpret, AudioFile.Album, AudioFile.Musiktitel, ...))
    4. Next