03.2 ObservableValidator

1. 출처 및 참고자료
더보기

✔️ Microsoft Docs: ObservableValidator (공식문서)

ObservableValidator는 INotifyDataErrorInfo를 구현하는 MVVM용 ViewModel 베이스 클래스입니다.
이 클래스를 상속하고 .ValidateAllProperties() 또는 .ValidateProperty() 메서드를 호출하면, 속성의 데이터 유효성 검사가 자동으로 수행되며, View에서 실시간으로 오류 메시지를 수신할 수 있습니다.
관련 어노테이션: [ObservableProperty], [Required], [MinLength], [MaxLength], [EmailAddress] 등
2. 기능명 or 기능 개요
더보기
✔️ 작동 방식
- ObservableObject를 상속하고 ObservableValidator까지 확장하면 속성 변경 + 유효성 검사를 모두 지원
- 속성에 System.ComponentModel.DataAnnotations 특성을 부여하여 유효성 검사 규칙 정의
- WPF 바인딩에서 ValidatesOnNotifyDataErrors=True를 사용하면 에러 메시지 출력 가능
🟢 장점
- MVVM 구조에 맞게 데이터 유효성 검사를 ViewModel에서 처리 가능
- WPF의 INotifyDataErrorInfo 자동 구현
- XAML 바인딩과 자연스럽게 통합됨
- DataAnnotations 기반으로 간단하게 규칙 설정 가능
🔴 단점
- 커스텀 복합 유효성 검사는 별도 로직 추가 필요
- 복잡한 유효성 규칙은 코드량이 많아질 수 있음
3. 예제1 - 사용자 이름과 이메일 유효성 검사
더보기


✔️ 동작 시나리오
- 사용자가 이름과 이메일을 입력
- [Required], [EmailAddress] 규칙에 따라 즉시 유효성 검사를 수행
- 오류 메시지를 출력
📁 프로젝트 구조
ObservableValidatorDemo/ ├── Models/ │ └── User.cs ├── ViewModels/ │ └── UserViewModel.cs ├── Views/ │ └── MainWindow.xaml └── MainWindow.xaml.cs
✔️ Model 클래스 만들기

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에서 유효성 정보를 자동으로 받음
✔️ 소스코드
WPF_ToolKit08.zip
0.11MB
댓글을 사용할 수 없습니다.