.NET MAUI - MVVM ObservableValidator
2022. 8. 12. 00:00ㆍMAUI
반응형
노출된 속성의 유효성 검사를 지원
속성 변경에 대한 알림과 유효성 검사를 모두 지원해야 하는 class 에서 사용할 수 있다.
- 일련의 추가 SetProperty 오버로드를 제공하여 자동으로 속성의 유효성을 검사하고 값을 업데이트하기 전에 필요한 이벤트를 발생시키는 기능을 제공
- 유효성 검사가 성공한 경우에만 대상 속성을 업데이트하고 추가 검사를 위해 생성된 오류(있는 경우)를 반환하는 기능이 있는 여러 TrySetProperty 오버로드를 노출
- 다른 속성에 종속된 속성이 그 자체의 값은 변경되지 않았지만 종속된 다른 속성이 업데이트된 경우 유효성 검사를 수동으로 트리거 할 수 있는 ValidateProperty 메서드 노출
- 현재 인스턴스의 모든 공용 인스턴스 속성에 대한 유효성 검사를 자동으로 실행하는 ValidateAllProperties 메서드를 노출
- 바인딩된 모델을 재설정할 때 유용할 수 있는 ClearAllErrors 메서드를 노출
- 속성의 유효성을 검사하는 데 사용할 ValidationContext 인스턴스를 초기화하기 위해 다른 매개변수를 전달할 수 있는 여러 생성자를 제공
ObservableValidator 사용 예
public class RegistrationForm : ObservableValidator
{
private string name;
[Required]
[MinLength(2)]
[MaxLength(100)]
public string Name
{
get => name;
set => SetProperty(ref name, value, true);
}
}
사용자 지정 유효성 검사를 추가하는 방법
public class RegistrationForm : ObservableValidator
{
private readonly IFancyService service;
public RegistrationForm(IFancyService service)
{
this.service = service;
}
private string name;
[Required]
[MinLength(2)]
[MaxLength(100)]
[CustomValidation(typeof(RegistrationForm), nameof(ValidateName))]
public string Name
{
get => this.name;
set => SetProperty(ref this.name, value, true);
}
public static ValidationResult ValidateName(string name, ValidationContext context)
{
RegistrationForm instance = (RegistrationForm)context.ObjectInstance;
bool isValid = instance.service.Validate(name);
if (isValid)
{
return ValidationResult.Success;
}
return new("The name was not validated by the fancy service");
}
}
위와 같이 [CustomValidation( check 하려는 Type, validation method name)] attribute를 사용하여 처리 한다.
Name 이 변경될때 마다 RegistrationForm class 의 ValidateName 을 통해 유효성을 검사한다.
또한 ValidationAttribute 를 구현하여 check 하는 방법도 있다.
public sealed class GreaterThanAttribute : ValidationAttribute
{
public GreaterThanAttribute(string propertyName)
{
PropertyName = propertyName;
}
public string PropertyName { get; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
object
instance = validationContext.ObjectInstance,
otherValue = instance.GetType().GetProperty(PropertyName).GetValue(instance);
if (((IComparable)value).CompareTo(otherValue) > 0)
{
return ValidationResult.Success;
}
return new("The current value is smaller than the other one");
}
}
public class ComparableModel : ObservableValidator
{
private int a;
[Range(10, 100)]
[GreaterThan(nameof(B))]
public int A
{
get => this.a;
set => SetProperty(ref this.a, value, true);
}
private int b;
[Range(20, 80)]
public int B
{
get => this.b;
set
{
SetProperty(ref this.b, value, true);
ValidateProperty(A, nameof(A));
}
}
}
관련영상
반응형
'MAUI' 카테고리의 다른 글
.NET MAUI - MVVM Messenger (0) | 2022.08.16 |
---|---|
.NET MAUI - MVVM Command (0) | 2022.08.15 |
.NET MAUI - MVVM ObservableRecipient (0) | 2022.08.11 |
.NET MAUI - MVVM ObservableObject (0) | 2022.08.10 |
.NET MAUI - MVVM and CommunityToolkit.Mvvm (0) | 2022.08.09 |