2009-07-16 2 views
3

내가 다음로드 내 창에 이벤트가 : 위의 초기화 각 속성에 대한DataContext가 설정된 경우 내 유효성 검사 규칙이 실행되지 않는 이유는 무엇입니까?

void Window_Loaded(object sender, RoutedEventArgs e) { 
    this.DataContext = new MyObject() { 
     MyDateTime = DateTime.Now, 
     MyNotEmptyString = "Not Empty", 
     MyNotUpperCaseString = "not upper case", 
     MyInteger = 20, 
     MyIntegerInRange = 1, 
     MyDouble = 4.56 
    }; 
} 

을, 나는 그것에 결합하는 TextBox을 가지고 각각의 그와 관련된 자신의 유효성 검사 규칙 (들)을 가지고.

this.DataContext이 설정되었을 때 처음으로 내 유효성 검사 규칙이 실행되지 않지만 양식이 정상적으로 사용될 때 작동합니다 (TextBox이 초점을 잃을 때 실행 됨). 이것의 뒤에 이유는 무엇 일 수 있 었는가? 내가 UpdateSourceTrigger="PropertyChanged" 설정했지만 그 도움이되지 않았다.

편집 : 여기 는 속성에 바인딩되는 TextBox의 예입니다

<TextBox Name="MyDoubleField"> 
    <TextBox.Text> 
     <Binding Path="MyDouble"> 
      <Binding.ValidationRules> 
       <local:TextIsDouble/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
+0

당신이 IDataErrorInfo 요구 사항을 의미합니까? CSLA 유효성 검사 규칙? – opedog

+0

IDataErrorInfo를 사용하고 있지 않습니다. 내가 의미하는 예를 보려면 편집 된 질문을 참조하십시오. 여전히 명확하지 않은 경우 알려 주시면 더 게시하겠습니다. – Pwninstein

답변

3

에 대답하는 부분이 쉽게 '왜'이 디자인입니다. 유효성 검사는 일반적으로 사용자 입력에 적용되며 저장된 데이터의 유효성을 검사하기위한 것이 아닙니다.

기본 질문은 컨텍스트를 설정 한 후 수동으로 유효성 검사를 활성화하는 방법입니다. 확실하지 않지만 WPF 윈도우에는 WinForms Validate() 메소드가 있습니다.

+0

이 질문에는 바인딩 된 필드에 대한 모든 유효성 검사 규칙을 수동으로 실행하는 함수가 있습니다. http://stackoverflow.com/questions/127477/detecting-wpf-validation-errors 그러나이 방법은 여전히 ​​유효하지 않습니다. 그냥 DataContext를 설정합니다 (버튼을 클릭 할 때 나중에 작동합니다). 내가 이것을하고 싶은 이유는 사용자에게 유효하지 않은 필드를 즉시 표시하는 것입니다. 저장된 데이터가 유효하지 않을 수 있습니다 (요구 사항은 데이터가 이미 저장된 후 이전 버전에서 변경됩니다). – Pwninstein

+0

Window_Loaded()에서 호출하는 것이 잘못된 이유는 무엇입니까? –

+0

DataContext를 설정 한 직후에 (즉, 킥을 위해 UpdateLayout()을 명시 적으로 호출하여)로드 된 이벤트에서 해당 함수를 호출하려고 시도했지만 그 중 하나가 작동하지 않았습니다. 이상한 ... – Pwninstein

0

유효성 검사가 데이터 클래스에없는 이유가 있습니까? IDataErrorInfo를 사용하면 즉시 데이터의 유효성을 확인한 다음 추가 작업없이 UI에 버블 링해야합니다.

우리가해야한다고 말하기는하지만 WPF는 사용하지 않습니다.

+0

항상 (데이터 클래스의 유효성 검사) 항상 가능한지 확실하지 않습니다.WCF와 WPF를 사용하는 프로젝트에서 작업 중이며 WPF 클라이언트가 사용하는 클래스는 WCF 계약에서 자동 생성됩니다. 그 유효성 검사를 자동 생성하는 방법이 없다면, 나는 내가 위에 보여준 것과 같이 일을 저지르고 있다고 생각합니다. 제발, 제 잘못을 증명하십시오! – Pwninstein

+0

오, WCF가 모든 것을 바꿉니다. WCF 서비스에서 데이터를 가져 오는 경우 datacontext로 직접 작업하지 않습니다. WCF를 ASP.Net 응용 프로그램에 적용했을 때 WCF 서비스는 데이터 공급자가되었고 데이터 검증이 포함 된 뷰 모델 클래스를 작성했습니다. 이러한 클래스는 데이터를 검색하고 IDataErrorInfo를 사용하여 ASP.Net 페이지에 오류를 전달합니다. – TheCodeMonk

0

DataContext를 설정할 때 유효성 검사가 실행되지 않는 이유는 대상에서 값 (AKA, 텍스트 상자가 변경되고 그에 따라 원본이 업데이트 됨)으로 원본이 업데이트 될 때만 WPF가 유효성 검사를 실행하기 때문입니다.

DataContext를 설정할 때 데이터의 유효성을 검사하려면 논리 트리를 반복해야하고 유효성 검사를 실행할 모든 요소에 대해 BindingExpression을 가져와 다음을 호출해야합니다. 바인딩 식 UpdateSource 메서드. 그것은 유효성 검사를 강제 할 것입니다.

그런 일이 될 것이다 수행하는 코드 : 유효성 검사 규칙에 의해

private void ValidateData() 
    {    
     //The XAML file defines a group of TextBox elements inside a Grid called grd 
     foreach (UIElement uie in grd.Children) 
     { 
      if (uie.GetType() == typeof(TextBox)) 
      { 
       ((TextBox)uie).GetBindingExpression(TextBox.TextProperty).UpdateSource();   
      } 
     }      
    } 
관련 문제