Improve validations
This commit is contained in:
@@ -6,10 +6,9 @@ namespace Toolkit.Foundation;
|
|||||||
public class Validation(IValidatorCollection validators) :
|
public class Validation(IValidatorCollection validators) :
|
||||||
IValidation
|
IValidation
|
||||||
{
|
{
|
||||||
public event PropertyChangedEventHandler? PropertyChanged;
|
|
||||||
|
|
||||||
private readonly ValidationErrorCollection errors = [];
|
private readonly ValidationErrorCollection errors = [];
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler? PropertyChanged;
|
||||||
public IReadOnlyDictionary<string, string> Errors =>
|
public IReadOnlyDictionary<string, string> Errors =>
|
||||||
errors.AsReadOnly();
|
errors.AsReadOnly();
|
||||||
|
|
||||||
@@ -44,6 +43,8 @@ public class Validation(IValidatorCollection validators) :
|
|||||||
string? name = GetPropertyName(property);
|
string? name = GetPropertyName(property);
|
||||||
Validator validator = new(name, rules);
|
Validator validator = new(name, rules);
|
||||||
|
|
||||||
|
Clear(name);
|
||||||
|
|
||||||
(bool isValid, string? message) = await validator.TryValidate();
|
(bool isValid, string? message) = await validator.TryValidate();
|
||||||
|
|
||||||
if (!isValid)
|
if (!isValid)
|
||||||
@@ -57,13 +58,9 @@ public class Validation(IValidatorCollection validators) :
|
|||||||
return !HasErrors;
|
return !HasErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<bool> Validate(string name)
|
public async Task<bool> Validate(string name)
|
||||||
{
|
{
|
||||||
if (Errors.ContainsKey(name))
|
Clear(name);
|
||||||
{
|
|
||||||
errors.Remove(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Validators.TryGet(name, out Validator? validator))
|
if (Validators.TryGet(name, out Validator? validator))
|
||||||
{
|
{
|
||||||
@@ -85,7 +82,7 @@ public class Validation(IValidatorCollection validators) :
|
|||||||
|
|
||||||
public async Task<bool> Validate()
|
public async Task<bool> Validate()
|
||||||
{
|
{
|
||||||
errors.Clear();
|
Clear();
|
||||||
foreach (Validator? validator in Validators)
|
foreach (Validator? validator in Validators)
|
||||||
{
|
{
|
||||||
if (validator.PropertyName is string name)
|
if (validator.PropertyName is string name)
|
||||||
@@ -104,12 +101,26 @@ public class Validation(IValidatorCollection validators) :
|
|||||||
return !HasErrors;
|
return !HasErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetPropertyName<T>(Expression<Func<T>> predicate)
|
private void Clear(string name)
|
||||||
{
|
{
|
||||||
Expression? body = predicate.Body;
|
if (Errors.ContainsKey(name))
|
||||||
MemberExpression? memberExpression = body as MemberExpression ??
|
{
|
||||||
(MemberExpression)((UnaryExpression)body).Operand;
|
errors.Remove(name);
|
||||||
|
OnPropertyChanged(nameof(Errors), null, null);
|
||||||
return memberExpression.Member.Name;
|
}
|
||||||
|
}
|
||||||
|
private void Clear()
|
||||||
|
{
|
||||||
|
errors.Clear();
|
||||||
|
OnPropertyChanged(nameof(Errors), null, null);
|
||||||
|
}
|
||||||
|
private string GetPropertyName<T>(Expression<Func<T>> expression)
|
||||||
|
{
|
||||||
|
return expression.Body switch
|
||||||
|
{
|
||||||
|
MemberExpression memberExpression => memberExpression.Member.Name,
|
||||||
|
UnaryExpression unaryExpression when unaryExpression.Operand is MemberExpression operand => operand.Member.Name,
|
||||||
|
_ => string.Empty
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user