삽질의 현장/- .NET

#119_닷넷(.NET)_ WPF_ 데이터 바인딩_유효성 검사

shovelman 2015. 12. 6. 17:19


안녕하세요 삽잡이입니다.


이번 시간에는 데이터 유효성 검사에 대해서 알아보려고합니다.



사용자로 부터 입력을 받게 될 때, 

해당 데이터가 UI로 들어갈 데이터에 맞는 성격인지, 

혹은, 제대로 입력했는지 검사하는 것을

'유효성 검사'라고 부릅니다.


예를 들어 나이를 입력하는 UI가 있다고 해봅시다.

여기에 SAP, 100000 이런 값이 오면 되겠습니까?

즉, 사용자의 Input이 맞는지를 보는 것입니다.

데이터가 올바른지 검사하는게 아니구요...


엉뚱한 값이 바인딩 된 데이터에 저장되면 안되겠지요...

따라서, 유효성은 데이터에 최신화 되기 전에 실시합니다.


모든 사용자 Input이 들어오는 곳에는 유효성검사가 있어야합니다.

그런데, 이 유효성 검사가 데이터 바인딩과 어떤 상관이 있을까요?



WPF에서는 UI에 입력받은 값을 바인딩해서 전달하기 전에

바인딩에서 유효성 검사를 자동적으로 수행합니다.

와우...


TextBox의 유효성 검사 로직 예시를 살펴보시죠.



TextBox에 바인딩 될 것이라는 것을 명시해주죠.

바인딩 된 원본의 형식을 보는 것입니다.

즉, 형식을 보고 검사한다는 것입니다.


사실 Default 적인 유효성 검사의 기능을 제공해주지만,

사용자가 강력하게 원하는 데로 유효성 검사를 하기 위해 

NotifyOnValidationError 속성을 설정해줍니다.




C# 코드에서 이런식으로 핸들러를 등록해놓을 수 있지요.

해당 예제는 ageTextBox에 대해서 

유효성 검사를 하는 핸들러를 만들어 놓은 것입니다.

그리고, 핸들러 등록을 해준 것이지요.


핸들러 호출이 될 떄,

핸들러에 Error에 대한 Args가 전달됩니다.

이 속성 Error을 보면 콘텐츠가 있습니다.

즉, 에러값을 보여줄 수 있다는 것입니다.


xaml 코드에서 NotifyOnValidationError를 없애버린다면,

유효성 검사를 실패하더라도,

핸들러에게 알려주지 않기 때문에 알림이 발생하지 않습니다.


따라서, 알림 보고를 받기 위해서는

1. 바인딩을 할 때 알림 보고를 한다는 코드를 작성한다.

2. 소스코드 내에서 에러 핸들러를 등록한다.


이와 같은 두가지를 해줘야합니다.



이렇게 유효성 검사를 통해

알림 보고를 받을 수 있습니다.


정리해보자면,

바인딩 문법에서 알림 보고를 받겠다는 명시를 해주고,

알림 보고 처리를 해줄 핸들러를 직접 등록해줬습니다.



그런데, 이렇게 귀찮게 할 필요 없이,

xaml 상에서 유효성 검사에 대한 알림 보고를 자동화 시킬 수 있습니다.

푸하하하하... 맨위에 쓸 껄 그랬나요...




리소스 선택하는 것까지 똑같지요.

Path의 속성은 어떤 속성과 바인딩 할지에 대해 설정하는 속성인데,

(Validation.Error)[0].ErrorContent 는 뭘까요...


인덱스가 있는 것으로 보아 컬렉션입니다.

즉, Validation.Errors가 컬렉션인 것입니다.

이 컬렉션의 [0] 은 첫번째 Validation Error을 뜻하는 것입니다.

즉, 해당 에러의 콘텐츠를 뜻하는 것이지요.


xaml의 경우,

에러를 발생시킬 수 있는 녀석을 여러개 등록할 수 있습니다.

그래서, 이 에러를 등록할 수 있는 Validation Error가 컬렉션으로 등록할 수 있는 것이고,

그 중 하나만 사용했기 때문에 [0]으로 지정한 것입니다.

즉, Error 콘텐츠를 Path로 지정한 것입니다.

Error 콘텐츠가 만들어지면, ToolTip에 바인딩 시키라는 의미이지요.


Binding RelativeSource={RelativeSource Self}는

자신 혹은, 자신과 부모의 관계를 Source로 선택하고자 할 때 사용합니다.

즉, 바인딩 원본이 자신 아니면 자신의 부모라는 것을 지정해주는 것이지요.


위의 예제 코드는

Error 콘텐츠가 발생하면 ToolTip에 연결시키라는 문법입니다.

결과적으로 툴팁에 자동 등록이 되는 것이지요.


xaml 코드를 통해 툴팁을 핸들러에서 등록할 필요 없이, 

자동적으로 적용시킬 수 있는 것입니다.


또한, 여러가지 규칙을 만들 수 있습니다.

즉, 사용자 규칙도 만들 수 있다는 것입니다.



해당 예시는 범위까지 주는 Rule을 준 것입니다.

이는 기본적인 제공이 되지 않기 때문에, 

직접 사용자가 제공해줘야합니다.


형식 검사를 하되, 범위를 넣은 것입니다.

즉, 정확한 유효성 검사를 못하기 때문에

우리가 사용자 정의 유효성 검사 규칙을 만들어줘야되는 것입니다.



따라서, 이렇게 사용자 정의 유효성 검사 규칙을 만들어준다면,

클래스 상에 정의를 해줘야합니다.



또한, 해당 클래스 내에는 

ValidationResult 메서드를 상속받아 구현해줘야합니다.


유효성 검사를 하게 될 때,

항상 바인딩 직전 ValidationResult 메서드를 호출해주게 됩니다.



이번 시간은 여기까지 하도록 하겠습니다.

이상 삽잡이였습니다!



<참고 : Programming WPF : 사용자 경험(UX)을 바꾸는 기술>