2011-05-03 2 views
0

에서, Validation.Error 해고되지 않습니다 이벤트를 발생하고 에 재산 NotifyOnValidationError 진정한하지 않습니다. 그래서, 방법 "Grid_Error (개체를 보낸 사람, ValidationErrorEventArgs e)는"실행되지 않습니다,하지만 난 몰라 왜 Window1.xaml.cs 파일 :(WPF ValidationRule 및 Validation.Error 내가 setthe 반면에이 코드를 잘못 무엇

<Window xmlns:my="clr-namespace:WpfDigitalClock;assembly=WpfDigitalClock" x:Class="WpfApplication1.MainWindow" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <local:Names x:Key="MyNames" /> 
</Window.Resources> 
<Grid Validation.Error="Grid_Error"> 
    <TextBox Height="21" Margin="12,62,0,0" Name="TextBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120"> 
     <TextBox.Text> 
      <Binding Source="{StaticResource MyNames}" Path="FirstName" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <local:StringValidator /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox Height="21" HorizontalAlignment="Right" Margin="0,62,12,0" Name="TextBox2" VerticalAlignment="Top" Width="120" > 
     <TextBox.Text> 
      <Binding Source="{StaticResource MyNames}" Path="LastName" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <local:StringValidator /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <Button HorizontalAlignment="Left" Margin="35,122,0,116" Name="Button1" Width="75" Click="Button1_Click">Back</Button> 
    <Button HorizontalAlignment="Right" Margin="0,122,34,117" Name="Button2" Width="75" Click="Button2_Click">Forward</Button> 
    <Button Height="22" Margin="101,0,101,56" Name="Button3" VerticalAlignment="Bottom" Click="Button3_Click">Add</Button> 
</Grid> 

:

public class StringValidator : ValidationRule 
{ 
    public override ValidationResult Validate(object value, 
     System.Globalization.CultureInfo cultureinfo) 
    { 
     string aString = value.ToString(); 
     if (aString == "") 
      return new ValidationResult(false, "String cannot be null"); 
     return new ValidationResult(true, null); 
    } 
} 

private void Grid_Error(object sender, ValidationErrorEventArgs e) 
{ 
    if(e.Action == ValidationErrorEventAction.Added) 
     MessageBox.Show(e.Error.ErrorContent.ToString()); 
} 
는 당신의 도움을 주셔서 감사합니다

편집 :!

여기 내 이름 클래스3210

:

여기
class Names : ObservableCollection<Name> 
{ 
    public Names() 
    { 
     Name aName = new Name("FirstName " + (this.Count +1).ToString(), 
      "LastName " + (this.Count + 1).ToString()); 

     this.Add(aName); 
    } 
} 

내 이름 클래스 : 귀하의 코멘트에서

class Name : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _firstName; 
    private string _lastName; 


    public Name(string fName, string lName) 
    { 
     _firstName = fName; 
     _lastName = lName; 
    } 

    public string FirstName 
    { 
     get 
     { 
      return _firstName; 
     } 
     set 
     { 
      _firstName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
     } 
    } 
    public string LastName 
    { 
     get 
     { 
      return _lastName; 
     } 
     set 
     { 
      _lastName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
     } 
    } 
} 
+0

텍스트 상자에 오류 (기본적으로 빨간색 테두리)가 표시됩니까? –

+0

아무 것도 나타나지 않습니다. : – Florian

+0

어떻게 마무리 했습니까 – DasDas

답변

2

내가 ValidationRule이 오류를 반환하지 않는 것으로 결론을 내릴 것은, 따라서 오류 이벤트는 트리거되지 않습니다. 디버거를 사용하여 Validation-method를 단계별로 실행하십시오.

또한 유효성 검사는 소스 업데이트시에만 수행되며 일반적으로 LostFocus에서 발생하는 텍스트 상자에서 수행됩니다.

편집 :MyNames은 모음으로, 바인딩하려고하는 속성이 없으므로 출력 창에 바인딩 오류가 있어야합니다.

첫 번째 요소에 바인딩하려면 경로를 마지막 이름 바인딩의 경우 [0].LastName과 같이 변경해야합니다.

+0

내 StringValidator 클래스의 Validate 메서드에 중단 점을 삽입하면 중단 점에 도달하지 않습니다. – Florian

+1

유효성 검사는 소스 업데이트에서만 수행됩니다. 'LostFocus'에서 일반적으로 발생하는 TextBox들 TextBox를 편집하고 다른 곳을 클릭 했습니까 –

+0

예 "TextBox1"외 "TextBox2"라는 2 개의 텍스트 상자의 .Text 속성을 채운 다음 "Button3"이라는 버튼을 클릭합니다 – Florian

0

이름 클래스가 INotifyPropertyChanged를 구현합니까?

파일의 코드 숨김 파일에서 데이터 액세스 텍스트를 this으로 설정하십시오. Names 개체를 해당 속성으로 노출시키고 해당 개체가 작동하는지 확인하십시오. 창의 정적 리소스에 바인딩하는 것에 익숙하지 않습니다.

3

이 응용 프로그램은이 모음의 내용을 수정할 수 없습니다. 이 첨부 된 속성을 사용하는 방법의 예는 예제 섹션을 참조하십시오.

WPF 데이터 바인딩 모델을 사용하면 ValidationRules를 Binding 개체와 연결할 수 있습니다. 유효성 검사는 변환기가 호출되기 전에 바인딩 대상 원본 값 전송을 바인딩하는 동안 발생합니다. 다음은 유효성 검사 프로세스에 대한 설명입니다.

1. 값이 대상 속성에서 source 속성으로 전송되는 경우 데이터 바인딩 엔진은 먼저 ValidateErrors 속성에 추가 된 ValidationError를 제거합니다. 바운드 요소. 그런 다음 해당 바인딩에 대해 정의 된 사용자 지정 ValidationRules가 있는지 확인합니다.이 경우 각 ValidationRules 중 하나가 오류로 실행되거나 모두 통과 할 때까지 Validate 메서드를 호출합니다.

2. 통과하지 못한 사용자 지정 규칙이있는 경우 바인딩 엔진은 ValidationError 개체를 만들고 바인딩 된 요소의 Validation.Errors 컬렉션에 추가합니다. 유효성 검사.오류가 비어 있지 않으면 요소의 Validation.HasError 연결된 속성이 true로 설정됩니다. 또한 Binding의 NotifyOnValidationError 속성이 true로 설정된 경우 바인딩 엔진은 요소의 Validation.Error 연결된 이벤트를 발생시킵니다.

3. 규칙이 모두 통과되면 바인딩 엔진이 변환기를 호출합니다 (존재하는 경우).

4. 변환기가 전달되면 바인딩 엔진은 source 속성의 setter를 호출합니다.

5. 바인딩에 ExceptionValidationRule이 연결되어 있고 단계에서 예외가 발생하면 바인딩 엔진은 UpdateSourceExceptionFilter가 있는지 확인합니다. UpdateSourceExceptionFilter 콜백을 사용하여 예외 처리를위한 사용자 지정 처리기를 제공하는 옵션이 있습니다. Binding에서 UpdateSourceExceptionFilter가 지정되지 않은 경우 바인딩 엔진은 예외가있는 ValidationError를 만들고 바인딩 된 요소의 Validation.Errors 컬렉션에 추가합니다.

양방향 (대상에서 대상 또는 대상에서 대상으로)의 유효한 값 전송은 Validation.Errors 연결된 속성을 지 웁니다.

MultiBinding 시나리오에서이 속성의 동작에 대한 자세한 내용은 ValidationError를 참조하십시오.

관련 문제