WPF 데이터 바인딩 및 유효성 검사 규칙 모범 사례


101

일부 사용자 지정 CLR 개체를 편집 할 수 있도록 데이터 바인딩을 사용하는 매우 간단한 WPF 응용 프로그램이 있습니다. 이제 사용자가 저장을 클릭 할 때 입력 유효성 검사를 입력하고 싶습니다. 그러나 내가 읽은 모든 WPF 책은 실제로이 문제에 어떤 공간도 할애하지 않습니다. 사용자 지정 ValidationRules를 만들 수 있다는 것을 알지만 이것이 내 요구에 과잉 일지 궁금합니다.

그래서 내 질문은 이것이다 : WPF에서 사용자 입력의 유효성을 검사하는 모범 사례를 보여주는 좋은 샘플 응용 프로그램이나 기사가 어딘가에 있습니까?

답변:


83

새로운 선호하는 방법은 IDataErrorInfo를 사용하는 것입니다.

여기에서 더 많은 것을 읽으 십시오


3
나는 또한 신치 프레임 워크 (발견했습니다 cinch.codeplex.com WPF + MVVM 모범 사례 검증의 데모를 포함), 및 IDataErrorInfo 사용
마크 히스

3
.NET 4.5에서는 INotifyErrorInfo를 사용하여 문자열 대신 개체를 반환 할 수 있습니다.
피터

24

MS의 Patterns & Practices 문서에서 :

데이터 검증 및 오류보고

뷰 모델 또는 모델은 종종 데이터 유효성 검사를 수행하고 데이터 유효성 검사 오류를보기에 신호하여 사용자가이를 수정할 수 있도록해야합니다.

Silverlight 및 WPF는 뷰의 컨트롤에 바인딩 된 개별 속성을 변경할 때 발생하는 데이터 유효성 검사 오류 관리를 지원합니다. 컨트롤에 데이터 바인딩 된 단일 속성의 경우 뷰 모델 또는 모델은 들어오는 잘못된 값을 거부하고 예외를 throw하여 속성 설정자 내에서 데이터 유효성 검사 오류를 알릴 수 있습니다. 데이터 바인딩의 ValidatesOnExceptions 속성이 true이면 WPF 및 Silverlight의 데이터 바인딩 엔진이 예외를 처리하고 데이터 유효성 검사 오류가 있다는 시각적 신호를 사용자에게 표시합니다.

그러나 이러한 방식으로 속성을 사용하여 예외를 throw하는 것은 가능하면 피해야합니다. 다른 방법은 뷰 모델 또는 모델 클래스에서 IDataErrorInfo 또는 INotifyDataErrorInfo 인터페이스를 구현하는 것입니다. 이러한 인터페이스를 통해 뷰 모델 또는 모델은 하나 이상의 속성 값에 대한 데이터 유효성 검사를 수행하고 사용자에게 오류를 알릴 수 있도록 오류 메시지를 뷰에 반환 할 수 있습니다.

문서는 IDataErrorInfo 및 INotifyDataErrorInfo를 구현하는 방법을 설명합니다.


3
처음에는 예외 추천 던지기를 보았을 때 걱정이되었습니다. "이러한 방식으로 속성을 사용하여 예외를 던지는 것은 가능한 한 피해야합니다"가 뒤 따르는 것을 보게되어 기쁩니다
kenwarner dec

22
또한 Microsoft의 일부 muppet은 .net4에 INotifyDataErrorInfo를 포함하지 않고 Silverlight에만 포함하기로 결정했습니다. 그 고통 ..
aL3891

5
@ al3891- .NET 4.5에서 정렬됩니다. msdn.microsoft.com/en-us/library/…
RichardOD

@ aL3891 누락 된 INotifyDataErrorInfo에 대한 대안이 있습니까?
AgentKnopf 2013 년

10

personaly, 유효성 검사를 처리하기 위해 예외를 사용하고 있습니다. 다음 단계가 필요합니다.

  1. 데이터 바인딩 식에 "ValidatesOnException = True"를 추가해야합니다.
  2. 바인딩하는 데이터 개체에서 새 값이 조건을 충족하는지 확인하는 DependencyPropertyChanged 처리기를 추가해야합니다. 그렇지 않은 경우 개체 이전 값으로 복원하고 (필요한 경우) 예외를 throw합니다.
  3. 컨트롤에 잘못된 값을 표시하는 데 사용하는 컨트롤 템플릿에서 오류 수집에 액세스하고 예외 메시지를 표시 할 수 있습니다.

여기서 트릭은 DependencyObject에서 파생 된 개체에만 바인딩하는 것입니다. INotifyPropertyChanged의 간단한 구현은 작동하지 않습니다. 프레임 워크에 버그가있어 오류 수집에 액세스 할 수 없습니다.


3

또한 이 기사를 확인 하십시오 . Microsoft 는 유효성 검사 주제를 다루는 패턴과 관행에서 엔터프라이즈 라이브러리 (v4.0) 를 출시 했지만 WPF에 대한 유효성 검사를 포함하지 않은 이유를 신이 알고 있으므로 제가 지시하는 블로그 게시물에서 작성자에 대해 설명합니다. 그것을 조정했습니다. 도움이 되었기를 바랍니다!


2

WPF WAF (Application Framework)BookLibrary 샘플 애플리케이션에 관심이있을 수 있습니다 . WPF에서 유효성 검사를 사용하는 방법과 유효성 검사 오류가있을 때 저장 단추를 제어하는 ​​방법을 보여줍니다.


0

비즈니스 클래스가 UI에서 직접 사용되는 경우 IDataErrorInfo를 사용하는 것이 더 좋습니다. 로직을 소유자에게 더 가깝게 배치하기 때문입니다.

비즈니스 클래스가 WCF / XmlWeb 서비스에 대한 참조로 생성 된 스텁 클래스 인 경우 ExceptionValidationRule과 함께 사용하기 위해 IDataErrorInfo를 사용하거나 예외를 throw 할 수 없습니다. 대신 다음을 수행 할 수 있습니다.

  • 사용자 지정 ValidationRule을 사용합니다.
  • WPF UI 프로젝트에서 부분 클래스를 정의하고 IDataErrorInfo를 구현합니다.

1
나는 이것이 오래되었다는 것을 알고 있지만 Alex가 대응할 수 있기를 바랍니다. 이것은 내가 또한 내린 결론이지만 문제는 ValidationRule에서 100보다 클 수없는 "Age"속성에 대한 일부 유효성 검사를 작성한 다음 IDataErrorInfo 인터페이스에서 동일한 논리를 반복해야한다는 것입니다. , wich는 논리를 복제합니다. 그 주위에 방법이 있습니까?
JFTxJ 2013 년

논리를 어디에 복제합니까? 어떤 종류의 서버 유효성 검사에서? 귀하의 의견으로 UI에서 IDataErrorInfo로 유효성을 검사하고 비즈니스 개체의 유효성 검사를 복제하고 있다고 생각합니다. 그렇다면 양쪽에서 검증하는 것이 옳습니다. (이 중복 보이지만) 비즈니스 오브젝트는 UI의 믿을 수없는 자체 검증을 수행해야합니다
알렉스 폴란를

아니요, 유효성 검사 논리의 중복은 IDataErrorInfo 및 사용자 지정 유효성 검사 규칙에 있습니다. 100) "필드 별"메시지를 반환하려면 IDataErrorInfo에 정의되어야하지만 사용자 지정 유효성 검사 규칙에서도 구현되어야합니다. 말이된다?
JFTxJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.