MahApps.Metro - DataGrid - RowValidationRules

  • Modern UI

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von BornToBeRoot.

    MahApps.Metro - DataGrid - RowValidationRules

    Hallo Zusammen,

    ich schlage mich jetzt seit einigen Tagen mit der Überprüfung von Benutzereingaben in einem DataGrid (neue Zeile) rum...

    Um eine neue Zeile zu prüfen habe ich bei Microsoft folgendes gefunden: msdn.microsoft.com/de-de/libra…ationrules(v=vs.110).aspx

    Jedoch werden Fehlerhafte eingaben nicht in der GUI als Fehler angezeigt... Der Benutzer kann aber -wenn ein Fehler besteht- keine neue Zeile anlegen... Also sollte die Überprüfung grundsätzlich funktionieren...

    Ich Benutze für die GUI die MahApps.Metro (v1.3.0)

    Validation rule...

    Spoiler anzeigen

    C#-Quellcode

    1. public class ValidateWakeOnLanTemplateRow : ValidationRule
    2. {
    3. public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    4. {
    5. WakeOnLanTemplate template = (value as BindingGroup).Items[0] as WakeOnLanTemplate;
    6. if (string.IsNullOrEmpty(template.MAC))
    7. return new ValidationResult(false, Application.Current.Resources["LocalizedString_ValidateError_MACAddressEmpty"] as string);
    8. if (!Regex.IsMatch(template.MAC, "^[A-Fa-f0-9]{12}$|^[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}(:|-){1}[A-Fa-f0-9]{2}$"))
    9. return new ValidationResult(false, Application.Current.Resources["LocalizedString_ValidateError_EnterValidMACAddress"] as string);
    10. if (string.IsNullOrEmpty(template.Hostname))
    11. return new ValidationResult(false, Application.Current.Resources["LocalizedString_ValidateError_HostnameEmpty"] as string);
    12. return ValidationResult.ValidResult;
    13. }
    14. }


    In meinem DataGrid...

    Spoiler anzeigen

    C#-Quellcode

    1. <DataGrid.RowValidationRules>
    2. <Validator:ValidateWakeOnLanTemplateRow ValidationStep="UpdatedValue" />
    3. </DataGrid.RowValidationRules>


    Ich habe in der Demo App von MahApps.Metro einen Workaround gefunden:

    Spoiler anzeigen

    C#-Quellcode

    1. <DataGrid.RowStyle>
    2. <Style BasedOn="{StaticResource MetroDataGridRow}"
    3. TargetType="{x:Type DataGridRow}">
    4. <Style.Triggers>
    5. <DataTrigger Binding="{Binding MAC, Mode=OneWay, Converter={StaticResource ConverterWakeOnLanTemplateRow}}"
    6. Value="True">
    7. <Setter Property="Background"
    8. Value="#FF8B8B" />
    9. <Setter Property="Foreground"
    10. Value="Red" />
    11. </DataTrigger>
    12. <!-- IsMouseOver -->
    13. <MultiDataTrigger>
    14. <MultiDataTrigger.Conditions>
    15. <Condition Binding="{Binding MAC, Mode=OneWay, Converter={StaticResource ConverterWakeOnLanTemplateRow}}"
    16. Value="True" />
    17. <Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Self}}"
    18. Value="true" />
    19. </MultiDataTrigger.Conditions>
    20. <Setter Property="Background"
    21. Value="#FFBDBD" />
    22. </MultiDataTrigger>
    23. </Style.Triggers>
    24. </Style>
    25. </DataGrid.RowStyle>


    Ich könnte ja mit dem Workaround leben... doch es stört mich, dass es bei einer Textbox einfach so klappt (ohne ErrorTemplate usw.) in dem man nur die ValidationRule hinzufügt...

    Long story short... die Zeile im DataGrid soll -wenn die Eingabe Fehlerhaft ist- so aussehen...

    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    Damit ich das richtig verstehe: In deiner Anwendung gibst du dem User ein DataGridView, in das er händisch (selbstständig) die Daten (in dem Fall eine MAC, eine IP und einen Port). Und in einer zweiten Ansicht zeigst du dem User die eingegebenen Daten wieder an.

    Dein Ziel ist es also, dem User schon bei der Eingabe ins DGV zu sagen, falls er eine falsche MAC oder IP eingegeben hat, dass er einen Fehler gemacht hat?
    Wieso erlaubst du dem User denn die Eingaben im DGV zu machen? Lass ihn halt ne neuen Eintrage einfügen, in dem er einen Dialog ausfüllt. Dann kannst du (leichter) feststellen, ob die Eingabe valide ist oder nicht.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell