.NET MAUI - MVVM ObservableValidator

2022. 8. 12. 00:00MAUI

반응형

노출된 속성의 유효성 검사를 지원

속성 변경에 대한 알림과  유효성 검사를 모두 지원해야 하는 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));
        }
    }
}

 

 

관련영상

https://youtu.be/czyIXciR2r8

 

 

 

반응형

'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