2011-01-04 11 views
3

일부 텍스트 상자에 WPF 유효성 검사를 구현하려고합니다. 나는 도구 팁보다 더 명백한 것으로 사용자에게 유효성 오류를 표시 할 수 있기를 원하지만 다이얼로그 나 메시지 상자보다 더 미묘하다. 이 방법으로 유효성을 검사해야하는 많은 다른 필드가 있기 때문에 Popup 클래스를 사용하여 오류를 표시하기 위해 텍스트 상자에 내장 된 텍스트 상자 대신에 피드백을 첨부해야합니다.WPF 유효성 검사 결과 팝업

내가 겪고있는 문제는 팝업 TextBox의 첨부 된 TextBox (Validation.Errors) 속성에 대한 바인딩이 공격적으로 충분히 업데이트되지 않는다는 것입니다. 오류 객체가있는 경우 텍스트가 업데이트되고 표시됩니다 (즉, 빈 필드에 "이름을 입력하십시오."). 그러나 오류가 변경되면 (즉, 사용자가 유효하지 않은 텍스트를 입력하는 경우) 팝업의 메시지는 그대로 유지됩니다 ... 그들이 유효한 입력을 입력 할 때까지 /까지, 팝업이 원하는대로 사라집니다.

일부 디버깅을했는데 유효성 검사 규칙이 올바르게 호출되고 적절한 결과를 반환하는 동안 팝업에 대한 변환기는 초기 오류가 생성 될 때만 호출된다는 사실을 발견했습니다. 내가 뭘 혼란스러워하는 이유는 유효성 검사 상태가 "오류 없음"에서 "일부 오류 (들)"로 바뀔 때만 팝업이 업데이트되는 이유입니다. 누구든지 Validation.Errors에 대한 변경을 강제로 내 Popup의 TextBox.Text에 반영하는 방법을 알고 있습니까?

다음은 내가 작성한 것에 대한 xaml 예제입니다.

<TextBox Name="MyTextBox"> 
    <TextBox.Text> 
     <Binding Path="MyText" UpdateSourceTrigger="PropertyChanged" > 
      <Binding.ValidationRules> 
       <local:MyTextBoxValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
<Popup Name="MyPopup" IsOpen="{Binding ElementName=MyTextBox, 
    Path=(Validation.HasError), Mode=OneWay}"> 
    <Border BorderThickness="1" BorderBrush="Red" Background="White"> 
     <TextBlock Foreground="Red" Margin="5 5 5 5" 
      Text="{Binding ElementName=MyTextBox, Path=(Validation.Errors), 
      Converter={StaticResource errorsToMessageConverter}}"/> 
    </Border> 
</Popup> 

답변

1

나는 타협점을 찾을 수있었습니다. 바인딩, 언제 까지나 당신의 수집이 구조적으로 변경하지 않는 한 (삽입/클리어/제거) : 컬렉션에 바인딩 할 때

<TextBlock Name="MyPopupTextBox" Foreground="Red" Margin="5 5 5 5" 
    Text="{Binding ElementName=MyTextBox, Path=(Validation.Errors)[0].ErrorContent, 
    UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnValidationError=True, 
    NotifyOnSourceUpdated=True, ValidatesOnExceptions=True}"/> 
0

원래 문제가 일반적인 문제 : 나는과 같이 팝업의 TextBlock의 구속 변경 업데이트 할 이유가 없습니다. 따라서 컬렉션의 항목 만 일부 속성을 변경하면 바인딩이 업데이트되지 않습니다.

이 컬렉션의 요소에 바인딩하여이 문제를 이미 해결 했으므로 변경된 속성 (ErrorContent)의 전체 경로가 바인딩에서 관찰됩니다.

(Validation.Errors)[0] 바인딩 문제는 Error-Collection이 비어있는 경우 IndexOutOfRange-Exceptions (발생하지 않지만 )를 발생시키는 것입니다.

이 스레드는 그 예외에 대해 설명하고 또한 나를 위해 잘 작동 해결 방법이 포함되어 http://social.msdn.microsoft.com/forums/en/wpf/thread/1c6cd214-abce-4a8b-a919-0726dd81461a/ 그냥 (Validation.Errors).CurrentItem.ErrorContent에 의해 (Validation.Errors)[0].ErrorContent를 교체하고 작업을 완료합니다.

관련 문제