2013-11-27 2 views
0

IDataError를 사용하여 컨트롤 및 텍스트 상자에서 내 개체 속성의 유효성을 검사하고 있습니다. 클래스에서 몇 가지 유효성 검사를 추가 한 다음 텍스트 상자 컨트롤에 바인딩을 추가했습니다.IDataErrorInfo 및 null 속성 바인딩 확인

public class Customer : IDataErrorInfo 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public long TributaryCode { get; set; } 

     #region IDataErrorInfo Members 

     public string Error 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public string this[string columnName] 
     { 
      get 
      { 
       string result = null; 
       if (columnName == "FirstName") 
       { 
        if (string.IsNullOrEmpty(FirstName)) 
         result = "Please enter a First Name"; 
       } 
       if (columnName == "LastName") 
       { 
        if (string.IsNullOrEmpty(LastName)) 
         result = "Please enter a Last Name"; 
       } 
       return result; 
      } 
     } 

     #endregion 
    } 

미안 데 문제가 TributaryCode가 비어있을 때, 나는 그것이 값을 '변환 할 수 없습니다라는 예외를 얻을 수 있습니다 :

이 내 클래스입니다. 이것은 종속 코드가 길고 null 값을 지원하지 않기 때문에 obviosly throw됩니다. 또한 텍스트 상자를 포함하는 UserControl이로드 될 때 값은 0으로 표시됩니다. 원하는 것은 비어있는 상태에서 시작하고 텍스트 상자가 비어 있으면 해당 예외를 throw하지 않는 것입니다.

그러면 무엇을해야합니까? 모든 속성을 nullable로 작성해야합니까? 그런 다음 이러한 클래스는 WCF 서비스의 요청 클래스로 변환되므로 가능한 해결책이지만 이것이 맞는지 질문하고 싶습니다.

또한 내가 말했듯이 이러한 모든 컨트롤은 UserControl에 있습니다. 이 UserControl 들어 ScrollViewer 들어있는 하나의 창이 있습니다. 유효성 검사는 텍스트 상자의 LostFocus 이벤트에서 수행되지만, 어떤 이유로 Window가 UserControl을로드하고로드 할 때 모든 빈 TextBox에 이미 유효성 검사를 통과하지 못했음을 나타내는 빨간색 테두리가 표시됩니다. 왜 이런 일이 일어날 수 있습니까? UserControl 항목과 관련이 있어야합니다.

이 내 텍스트 상자 XAML 중 하나입니다

<TextBox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1" 
    Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName, 
      ValidatesOnDataErrors=true, NotifyOnValidationError=true}" /> 

감사합니다!

답변

1

당신이 겪고있는 것은 모두 정상입니다.

문제 미안이 갖는 TributaryCode가 비어있을 때, 나는 그것이 가치 ''

이 정말 당신을 귀찮게하는 경우를 변환 할 수 없습니다라는 예외를 얻을, 당신이 가지고있는 솔루션 수; 0으로 값을 초기화 할 수 있습니다. PreviewKeyDown 핸들러를 추가하여 long 값만 허용 할 수 있습니다. 당신이 nullable long 사용할 수 있습니다

public long? TributaryCode { get; set; } 

창로드 및 해당 UserControl을로드, 내 모든 빈 텍스트 상자는 않았나 검증

을 통과 것을 나타내는 이미 빨간색 테두리가 다시 말하지만, 이는 정상적인 현상입니다. 속성에 값이없는 경우에는 그 외에 무엇을 기대합니까? 이것을 예측 유효성 검사라고하며, 사용자가 에 대해 경고하기 전에 저장하려고합니다. 개인적으로, 나는 사용자가 항상 할 수있는 것과 할 수없는 것을 알고 있기 때문에이 시스템을 선호한다.

+0

답장을 보내 주셔서 감사합니다. 이미 TributaryCode 텍스트 상자를 "마스크"하여 숫자 만 허용하도록 사용자를 제한했습니다. 솔루션이 긴 것을 사용하는지 알고 싶습니다. 대신에 길다. 그런 다음 유효성 검사에 대해 필자는 텍스트 상자가 포커스를 얻었을 때 유효성을 확인한 다음 포커스를 잃어 버렸을 때 유효성을 검사한다고 생각했습니다. 초기화하지 않을 때.나는 사용자가 창을 열고 빨간색 테두리가있는 텍스트 상자가 가득 찬 창을보고 그가 아이디어를 완성하려고 시도 할 때처럼 생각하지 않습니다. 너 무슨 말인지 알지? – Andres

+0

'TextBox' 컨트롤에서'Binding.UpdateSourceTrigger'를'LostFocus'로 변경하면'TextBox' 포커스가 없어 질 때까지'Binding' 업데이트를 지연시켜야합니다.하지만 그렇게 할 수 있다고 보장 할 수는 없습니다 시작 유효성 검증 오류를 제거합니다. – Sheridan

+0

네, 그랬습니다. 내 질문에 XAML 코드를 보여줍니다. 나는 그 행동이 창에서 일어나지 않는다고 확신했다. 그래도 확인해야합니다. – Andres