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