From 5e170ea526305452bb8cacb6105f1b46d3cb7b9f Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sat, 22 Jun 2024 14:06:54 +0100 Subject: [PATCH] Improve validations --- Toolkit.Foundation/Validation.cs | 39 ++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Toolkit.Foundation/Validation.cs b/Toolkit.Foundation/Validation.cs index 035485c..ed6f95e 100644 --- a/Toolkit.Foundation/Validation.cs +++ b/Toolkit.Foundation/Validation.cs @@ -6,10 +6,9 @@ namespace Toolkit.Foundation; public class Validation(IValidatorCollection validators) : IValidation { - public event PropertyChangedEventHandler? PropertyChanged; - private readonly ValidationErrorCollection errors = []; + public event PropertyChangedEventHandler? PropertyChanged; public IReadOnlyDictionary Errors => errors.AsReadOnly(); @@ -44,6 +43,8 @@ public class Validation(IValidatorCollection validators) : string? name = GetPropertyName(property); Validator validator = new(name, rules); + Clear(name); + (bool isValid, string? message) = await validator.TryValidate(); if (!isValid) @@ -57,13 +58,9 @@ public class Validation(IValidatorCollection validators) : return !HasErrors; } - public async Task Validate(string name) { - if (Errors.ContainsKey(name)) - { - errors.Remove(name); - } + Clear(name); if (Validators.TryGet(name, out Validator? validator)) { @@ -85,7 +82,7 @@ public class Validation(IValidatorCollection validators) : public async Task Validate() { - errors.Clear(); + Clear(); foreach (Validator? validator in Validators) { if (validator.PropertyName is string name) @@ -104,12 +101,26 @@ public class Validation(IValidatorCollection validators) : return !HasErrors; } - private string GetPropertyName(Expression> predicate) + private void Clear(string name) { - Expression? body = predicate.Body; - MemberExpression? memberExpression = body as MemberExpression ?? - (MemberExpression)((UnaryExpression)body).Operand; - - return memberExpression.Member.Name; + if (Errors.ContainsKey(name)) + { + errors.Remove(name); + OnPropertyChanged(nameof(Errors), null, null); + } + } + private void Clear() + { + errors.Clear(); + OnPropertyChanged(nameof(Errors), null, null); + } + private string GetPropertyName(Expression> expression) + { + return expression.Body switch + { + MemberExpression memberExpression => memberExpression.Member.Name, + UnaryExpression unaryExpression when unaryExpression.Operand is MemberExpression operand => operand.Member.Name, + _ => string.Empty + }; } }