ObservableValidator는 INotifyDataErrorInfo를 구현하는 MVVM용 ViewModel 베이스 클래스입니다. 이 클래스를 상속하고 .ValidateAllProperties() 또는 .ValidateProperty() 메서드를 호출하면, 속성의 데이터 유효성 검사가 자동으로 수행되며, View에서 실시간으로 오류 메시지를 수신할 수 있습니다.
관련 어노테이션: [ObservableProperty], [Required], [MinLength], [MaxLength], [EmailAddress] 등
public class User
{
public string Name { get; set; }
public string Email { get; set; }
}
✔️ ViewModel 클래스 만들기 (MainViewModel.cs)
// ObservableValidator를 상속받은 ViewModel 클래스
// - [ObservableProperty] 속성을 통해 자동으로 public 프로퍼티와 변경 알림이 생성됨
// - DataAnnotations 특성을 이용해 유효성 검사 규칙 정의
// - On<Property>Changed partial 메서드를 오버라이드하여 값이 변경될 때 ValidateProperty() 호출
public partial class UserViewModel : ObservableValidator
{
// 이름 속성 정의
// - [Required]: 필수 항목이며, 비어있을 경우 지정된 오류 메시지 출력
// - [ObservableProperty]: name 필드에 대응하는 Name 프로퍼티를 자동 생성하고 PropertyChanged 이벤트 지원
[ObservableProperty]
[Required(ErrorMessage = "이름은 필수 항목입니다.")]
private string name;
// 이메일 속성 정의
// - [Required]: 필수 항목
// - [EmailAddress]: 이메일 형식이 아닐 경우 오류 메시지 출력
[ObservableProperty]
[Required(ErrorMessage = "이메일은 필수 항목입니다.")]
[EmailAddress(ErrorMessage = "유효한 이메일 주소를 입력하세요.")]
private string email;
// 이름이 변경될 때 유효성 검사 실행
// ValidateProperty는 지정된 속성 하나에 대해 DataAnnotations 기반 검사 수행
partial void OnNameChanged(string value) => ValidateProperty(value, nameof(Name));
// 이메일이 변경될 때 유효성 검사 실행
partial void OnEmailChanged(string value) => ValidateProperty(value, nameof(Email));
}
✔️ XAML 화면 구성
xmlns:viewModels="clr-namespace:ObservableValidatorDemo.ViewModels"
Title="ObservableValidator 예제" Height="250" Width="400">
<!-- ViewModel을 데이터 소스로 설정 -->
<Window.DataContext>
<viewModels:UserViewModel/>
</Window.DataContext>
<StackPanel Margin="20">
<!-- 이름 입력 필드 설명 -->
<TextBlock FontWeight="Bold">이름 (필수)</TextBlock>
<TextBlock FontSize="11" Foreground="Gray" Margin="0,0,0,2">
<!-- 사용자에게 유효성 검사 기준을 안내 -->
※ 이름은 반드시 입력해야 합니다.
</TextBlock>
<!-- 이름 입력 TextBox -->
<TextBox x:Name="NameBox"
Margin="0 5"
Text="{Binding Name,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnNotifyDataErrors=True}"
PlaceholderText="이름 입력"/>
<!-- 이름 유효성 검사 오류 메시지 출력 -->
<TextBlock Foreground="Red" FontSize="12"
Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=NameBox}"/>
<!-- 이메일 입력 필드 설명 -->
<TextBlock FontWeight="Bold" Margin="0,10,0,0">이메일 (필수, 이메일 형식)</TextBlock>
<TextBlock FontSize="11" Foreground="Gray" Margin="0,0,0,2">
<!-- 사용자에게 유효성 검사 기준을 안내 -->
※ 이메일 주소를 올바르게 입력해주세요. 예: user@example.com
</TextBlock>
<!-- 이메일 입력 TextBox -->
<TextBox x:Name="EmailBox"
Margin="0 5"
Text="{Binding Email,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnNotifyDataErrors=True}"
PlaceholderText="이메일 입력"/>
<!-- 이메일 유효성 검사 오류 메시지 출력 -->
<TextBlock Foreground="Red" FontSize="12"
Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=EmailBox}"/>
</StackPanel>
</Window>
✔️ 결과
이름 또는 이메일을 비워두거나 잘못된 이메일 형식 입력 시 실시간으로 오류 메시지 표시
ObservableValidator가 INotifyDataErrorInfo를 구현하여 View에서 유효성 정보를 자동으로 받음