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 - 사용자 이름과 이메일 유효성 검사

더보기

✔️ 동작 시나리오

 

  1. 사용자가 이름과 이메일을 입력
  2. [Required], [EmailAddress] 규칙에 따라 즉시 유효성 검사를 수행
  3. 오류 메시지를 출력


📁 프로젝트 구조

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